不知道为什么,只有40分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll T,n,a[100010];
ll dp[100010];
struct node{
ll maxx,tag;
}t[400010];
void down(ll k,ll l,ll r){
t[k<<1].tag+=t[k].tag;
t[k<<1|1].tag+=t[k].tag;
t[k<<1].maxx+=t[k].tag;
t[k<<1|1].maxx+=t[k].tag;
t[k].tag=0;
}
void build(int l,int r,int p) {
if(l>r)return ;
t[p].maxx=0;
if(l==r)return ;
int mid=l+r>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
}
void modify(ll k,ll l,ll r,ll ql,ll qr,ll x){
if(l>qr||r<ql||l>r)return ;
if(l>=ql&&r<=qr){
t[k].tag+=x;
t[k].maxx+=x;
return ;
}
down(k,l,r);
ll mid=l+r>>1;
modify(k<<1,l,mid,ql,qr,x);
modify(k<<1|1,mid+1,r,ql,qr,x);
t[k].maxx=max(t[k<<1].maxx,t[k<<1|1].maxx);
}
ll query(ll k,ll l,ll r,ll ql,ll qr){
if(l>qr||r<ql||l>r)return 0;
if(l>=ql&&r<=qr)return t[k].maxx;
down(k,l,r);
ll mid=l+r>>1,res=0;
res=max(res,query(k<<1,l,mid,ql,qr));
res=max(res,query(k<<1|1,mid+1,r,ql,qr));
return res;
}
int main(){
cin>>T;
while(T--){
cin>>n;
build(1,n,1);
for(ll i=1;i<=n;i++){
cin>>a[i];
}
for(ll i=n;i>=1;i--){
dp[i]=a[i];
ll l=i+1,r=min(n,i+a[i]);
dp[i]=max(dp[i],query(1,1,n,l,r));
modify(1,1,n,l,n,a[i]),
modify(1,1,n,i,i,dp[i]);
}
cout<<dp[1]<<endl;
}
return 0;
}