下大分,流泪了。WA4 求调/hack。
#include<bits/stdc++.h>
using namespace std;
const int N=300005;
const int inf=1000000005;
inline int read(){
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
} int n,a[N],to[N],top[N],len[N],mxlen[N],g[N],ans[N];
inline void solve(){
n=read();
for(int i=1;i<=n;i++) a[i]=read(),g[i]=-inf;
len[n+1]=mxlen[n+1]=0; top[n+1]=n+1;
for(int i=n;i;i--){
to[i]=i+a[i]+1;
if(to[i]<=n+1) len[i]=len[to[i]]+1,top[i]=top[to[i]];
else len[i]=0,top[i]=i;
if(top[i+1]==n+1&&len[i+1]==a[i]) ans[i]=0;
else if(top[i+1]==n+1) ans[i]=1;
else if(len[i+1]+g[top[i+1]]+1>=a[i]) ans[i]=1;
else ans[i]=2;
mxlen[i]=mxlen[i+1];
if(top[i]!=n+1)
g[top[i]]=max(g[top[i]],-len[i]+mxlen[i+1]);
else
mxlen[i]=max(mxlen[i],len[i]);
// cerr << i << ' ' << top[i] << ' ' << len[i] << '\n';
}
for(int i=1;i<n;i++) printf("%d%c",ans[i],i==n-1?'\n':' ');
}
int main(){
int tc=read();
while(tc--) solve();
return 0;
}