#include<bits/stdc++.h>
using namespace std;
struct node{long long l,r,n,add=-1;
};
node tree[10000010];
long long a[100010],b[100010],T;
long long build(int p,int l,int r){
node temp;temp.l=l;temp.r=r;
if (l==r)
{
if (l==1){temp.n=0;tree[p]=temp;return tree[p].n;}
else{temp.n=1e10;tree[p]=temp;return tree[p].n;}
}
int mid=(l+r)/2;
temp.n=max(build(p*2,l,mid),build(p*2+1,mid+1,r));
tree[p]=temp;
return tree[p].n;
}
long long update(int s,int p){
if (s==p) return tree[s].n;
int mid=(tree[s].l+tree[s].r)/2;
if (tree[p].l<=mid) update(s*2,p);
if (tree[p].l>mid) update(s*2+1,p);
return tree[s].n=max(tree[s*2].n,tree[s*2+1].n);
}
void change(int s){
if (tree[s].add==-1) return;
if (tree[s*2].l!=0&&tree[s].add<tree[s*2].n){
tree[s*2].n=tree[s].add;
tree[s*2].add=tree[s].add;
}
if (tree[s*2+1].l!=0&&tree[s].add<tree[s*2+1].n){
tree[s*2+1].n=tree[s].add;
tree[s*2+1].add=tree[s].add;
}
tree[s].add=-1;return;
}
long long find(long long p,int s)
{
if (tree[s].l==p&&p==tree[s].r) return tree[s].n;
change(s);
int mid=(tree[s].l+tree[s].r)/2;
if (p<=mid) return find(p,s*2);
if (p>mid) return find(p,s*2+1);
}
void search(int m,int l,int r,int s){
if (tree[s].l==l&&r==tree[s].r){
if(m<tree[s].n){
tree[s].n=m;
if (tree[s].l!=tree[s].r) tree[s].add=m;
update(1,s);
}
return;
}
change(s);
int mid=(tree[s].l+tree[s].r)/2;
if (l<=mid&&m<tree[2*s].n) search(m,l,min(mid,r),2*s);
if (r>mid&&m<tree[2*s+1].n) search(m,max(mid+1,l),r,2*s+1);
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>T;
while (T--)
{
int n;
long long answer=0;
cin>>n;
for (int i=1;i<=n;i++) {cin>>a[i];b[i]=b[i-1]+a[i];}
build(1,1,n);
for (int i=1;i<=n-1;i++)
{
if (a[i]>=1) search(find(i,1)+a[i],i+1,i+a[i],1);
}
for (int i=1;i<=n;i++)
{
answer=max(answer,b[i]-find(i,1));
}
cout<<answer<<'\n';
}
return 0;
}
求助,卡了好久了