萌新刚学OI,分块能过样例全WA求调
查看原帖
萌新刚学OI,分块能过样例全WA求调
137508
flywatre楼主2022/6/18 14:43
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int f=1,j=0;char w=getchar();
	while(w>'9'||w<'0'){
		if(w=='-')f=-1;
		w=getchar();
	} 
	while(w>='0'&&w<='9'){
		j=(j<<3)+(j<<1)+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=200001,M=100001;
int n,m,k,sum[N];
int rk[N],last[N];
inline int gk(int a){return (a-1)/k+1;}
signed main(){
//	freopen("P3203_1.in","r",stdin);
//	freopen("ans.out","w",stdout);
	n=rd();k=sqrt(n);
	for(int i=1;i<=n;i++)sum[i]=rd();
	for(int i=n;i>=1;i--){
		rk[i]=1;last[i]=i+sum[i];
		if(last[i]<=n&&gk(last[i])==gk(i))rk[i]+=rk[last[i]],last[i]=last[last[i]];
	}
	m=rd();
	while(m--){
		int k=rd();
		if(k==1){
			int x=rd()+1,ans=0;
			while(x<=n)ans+=rk[x],x=last[x];
			printf("%d\n",ans);
		}
		else{
			int x=rd()+1,y=rd();
			sum[x]=y;
			int j=gk(x),l=(j-1)*k+1,r=min(j*k,n);
			for(int i=r;i>=l;i--){
				rk[i]=1;last[i]=i+sum[i];
				if(last[i]<=n&&gk(last[i])==gk(i))rk[i]+=rk[last[i]],last[i]=last[last[i]];
			}
		}
	}
	return 0;
}
2022/6/18 14:43
加载中...