RT,小数据没问题,但测试数据全T,下了#1发现死循环,但我看不出哪里会死循环,求大佬指出。
#include<bits/stdc++.h>
using namespace std;
int faa[200005],son[200005][2],dep[200005],siz[200005],n,m,xx,y,z,qq,x[200005];
int inline what(int x){
return x==son[faa[x]][1];}
void inline gxsz(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;}
bool inline rt(int x){
return x==son[faa[x]][0]||x==son[faa[x]][1];
}
void inline zig(int x){
qq=faa[x];
if(faa[qq]!=0){
son[faa[qq]][what(qq)]=x;}
faa[x]=faa[qq];
faa[qq]=x;
son[qq][0]=son[x][1];
faa[son[x][1]]=qq;
son[x][1]=qq;
gxsz(qq);
gxsz(x);
}
void inline zag(int x){
qq=faa[x];
if(faa[qq]!=0){
son[faa[qq]][what(qq)]=x;}
faa[x]=faa[qq];
faa[qq]=x;
son[qq][1]=son[x][0];
faa[son[x][0]]=qq;
son[x][0]=qq;
gxsz(qq);
gxsz(x);
}
void inline spj(int x){
while(rt(x)){
if(what(x)==what(faa[x])){
if(what(x)==0){
if(rt(faa[x]))
zig(faa[x]);
zig(x);
}
else{
if(rt(faa[x]))
zag(faa[x]);
zag(x);
}}
else if(what(x)==0)zig(x);else zag(x);
}}
int inline asa(int x){
int q=0;
while(x){
spj(x);
son[x][1]=q;
faa[q]=x;// for(int i=1;i<=n+1;i++)cout<<i<<" "<<faa[i]<<" "<<son[i][0]<<" "<<son[i][1]<<endl;
gxsz(x);
// cout<<"opop"<<son[x][0]<<" "<<son[x][1]<<" "<<siz[son[x][0]]<<" "<<siz[son[x][1]]<<endl;
// cout<<x<<"hhh"<<siz[x]<<endl;
q=x;
x=faa[x];
}
return q;
}
void inline link(int x,int y){
faa[x]=y;
}
void inline cut(int x,int y){
asa(x);spj(x);son[x][0]=0;faa[y]=0;gxsz(x);gxsz(y);
}
int main(){
//freopen("1.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i];
if(i+x[i]<=n)
faa[i]=i+x[i];
}
cin>>m;
for(int i=1;i<=m;i++){
// cout<<"hhh"<<i<<endl;
cin>>xx>>y;
y++;
if(xx==1)cout<<siz[asa(y)]<<endl;
else{
cin>>z;
if(y+x[y]<=n)
cut(y,y+x[y]);
if(y+z<=n)
link(y,y+z);
else
faa[y]=0;
x[y]=z;
}
}
}