rt 发现是输出比较耗时,但快读也打了
200000的数据4s,只能过n=10
c++14,O2也开过
同学A了,评测机应该还好
有人知道为什么吗bollboll了``` #include<bits/stdc++.h> #include<windows.h> using namespace std; const int MAX=200010; int a[MAX],c[MAX],to[MAX],block[MAX],n,m,opt,x,y,k; inline int read(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x; } void write(int x){ if(x>9) write(x/10); putchar(x%10+'0'); } inline int query(int x){ int ans=0; while(x<=n){ans+=a[x];x=to[x];/cout<<x<<endl;/} write(ans);putchar(10); } int main(){ DWORD star=GetTickCount(); freopen("1.txt","r",stdin); n=read();k=sqrt(n); if(n>100000) k=10000; for(int i=1;i<=n;++i) c[i]=read(),block[i]=(i-1)/k+1; for(int i=n;i;--i){ to[i]=i+c[i]; if(to[i]>(block[i]-1)*k) a[i]=1; else a[i]=a[to[i]]+1,to[i]=to[to[i]];//去下一个块 }m=read(); while(m--){ opt=read(); if(opt==2){ x=read()+1;c[x]=read(); to[x]=x+c[x]; if(to[x]>(block[x]-1)*k) a[x]=1; else a[x]=a[to[x]]+1,to[x]=to[to[x]]; //cout<<a[x]<<' '<<to[x]<<" "<< }if(opt==1){ x=read()+1;query(x);//printf("\n"); } }DWORD end=GetTickCount(); cout<<(end-star)<<"ms."<<endl; }