比赛 |
2025.3.6 |
评测结果 |
AAAAAAAAAA |
题目名称 |
弹飞绵羊 |
最终得分 |
100 |
用户昵称 |
djyqjy |
运行时间 |
1.802 s |
代码语言 |
C++ |
内存使用 |
6.24 MiB |
提交时间 |
2025-03-06 19:54:32 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
inline int re()
{
int f=1,num=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
return num*f;
}
const int N=200010;
int n,m,k;
int a[N];
int L[N],R[N],bel[N];
int to[N],b[N];
int op,x,y;
int ans;
int main()
{
freopen("bzoj_2002.in","r",stdin);
freopen("bzoj_2002.out","w",stdout);
n=re();k=ceil(sqrt(n));
for(int i=1;i<=(n-1)/k+1;i++) L[i]=(i-1)*k+1,R[i]=min(n,i*k);
for(int i=1;i<=n;i++) bel[i]=(i-1)/k+1;
for(int i=1;i<=n;i++) a[i]=re();
for(int i=n;i>=1;i--)
{
if(i+a[i]>R[bel[i]]) to[i]=i+a[i],b[i]=1;
else to[i]=to[i+a[i]],b[i]=b[i+a[i]]+1;
}
m=re();
while(m--)
{
op=re();
if(op==1)
{
x=re()+1;ans=0;
while(x<=n) ans+=b[x],x=to[x];
printf("%d\n",ans);
}
else
{
x=re()+1;y=re();
a[x]=y;
for(int i=R[bel[x]];i>=L[bel[x]];i--)
{
if(i+a[i]>R[bel[i]]) to[i]=i+a[i],b[i]=1;
else to[i]=to[i+a[i]],b[i]=b[i+a[i]]+1;
}
}
}
return 0;
}