比赛 |
2025.3.6 |
评测结果 |
AAATTTAAAT |
题目名称 |
弹飞绵羊 |
最终得分 |
60 |
用户昵称 |
李奇文 |
运行时间 |
9.431 s |
代码语言 |
C++ |
内存使用 |
6.01 MiB |
提交时间 |
2025-03-06 21:56:19 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=2e5;
int f[N],c[N][2],s[N];
void re(int x){
int y=f[x],z=f[y],k=c[y][1]==x,w=c[x][!k];
if(c[f[y]][0]==y||c[f[y]][1]==y) c[z][c[z][1]==y]=x;c[x][!k]=y;c[y][k]=w;
if(w) f[w]=y;f[y]=x;f[x]=z;
s[y]=s[c[y][0]]+s[c[y][1]]+1;
}
void wstb(int x){
int y,z;
while(c[f[x]][0]==x||c[f[x]][1]==x){
y=f[x];z=f[y];
if(c[f[y]][0]==y||c[f[y]][1]==y) re((c[y][0]==x)^(c[z][0]==y)?x:y);
re(x);
}
s[x]=s[c[x][0]]+s[c[x][1]]+1;
}
void dnl(int x){
for(int y=0;x;x=f[y=x]){
wstb(x),c[x][1]=y,s[x]=s[c[x][0]]+s[c[x][1]]+1;
}
}
int n,m,j,k;
int main(){
freopen("bzoj_2002.in","r",stdin);
freopen("bzoj_2002.out","w",stdout);
std::cin>>n;
for(j=1;j<=n;++j){
s[j]=1;
std::cin>>k;
if(j+k<=n)f[j]=j+k;
}
std::cin>>m;
while(m--){
int tb;
std::cin>>tb;
if(tb==1){
std::cin>>j;
++j;
dnl(j);
wstb(j);
std::cout<<s[j]<<endl;
}
else{
std::cin>>j>>k;
++j;
dnl(j);
wstb(j);
c[j][0]=f[c[j][0]]=0;
if(j+k<=n)f[j]=j+k;
s[j]=s[c[j][0]]+s[c[j][1]]+1;
}
}
return 0;
}