比赛 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;
}