8分,剩下RE+TLE
查看原帖
8分,剩下RE+TLE
380950
2020wty楼主2024/8/9 20:56
#include<bits/stdc++.h>
#define re register int
#define il inline
using namespace std;
const int N=4e5+10;
int fa[N],nx[N],n,m,op,lstans,kuai,k,x,y,chg[1650];
long long tag[1650];
il int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
	while(ch>='0'&ch<='9'){x=(x<<3)+(x<<1)+(ch-'0');ch=getchar();}
	return x*f;
}
il long long MAX(long long A,long long B){return A>B?A:B;}
il long long MIN(long long A,long long B){return A<B?A:B;}
il int NX(int u){
	if(chg[u/kuai]<=kuai)return nx[u];
	return MAX(1ll,fa[u]-tag[u/kuai]);
}
il int FA(int u){
	if(chg[u/kuai]<=kuai)return fa[u];
	return MAX(1ll,fa[u]-tag[u/kuai]);
}
int main(){
	n=read();m=read();
	kuai=sqrt(n);
	for(re i=2;i<=n;i++)fa[i]=read();
	fa[1]=1;nx[1]=1;
	for(re i=2;i<=n;i++){
		if(fa[i]/kuai!=i/kuai)nx[i]=fa[i];
		else nx[i]=nx[fa[i]];
	}
	while(m--){
		op=read();x=read();y=read();
		x^=lstans;y^=lstans;
		if(op==1){
			k=read();
			k^=lstans;
			if(x/kuai==y/kuai){//每一个块的界都是模它为0~kuai-1的  同块暴力改 
				for(re i=x;i<=y;i++)fa[i]=max(fa[i]-k,1);
				for(re i=x;i<min(n+1,(y/kuai+1)*kuai);i++){
					if(chg[i/kuai]<=kuai){
						if(fa[i]/kuai!=i/kuai)nx[i]=fa[i];
						else nx[i]=nx[fa[i]];
					}
				}
			}
			else{
				int l=x,r=y;
				for(re i=l;i<min(n+1,(l/kuai+1)*kuai);i++)
					fa[i]=max(fa[i]-k,1);
				for(re i=l;i<min(n+1,(l/kuai+1)*kuai);i++){
					if(chg[i/kuai]<=kuai){
						if(fa[i]/kuai!=i/kuai)nx[i]=fa[i];
						else nx[i]=nx[fa[i]];
					}
				}
				for(re i=r/kuai*kuai;i<=r;i++)
					fa[i]=max(fa[i]-k,1);
				for(re i=r/kuai*kuai;i<=r;i++){
					if(chg[i/kuai]<=kuai){
						if(fa[i]/kuai!=i/kuai)nx[i]=fa[i];
						else nx[i]=nx[fa[i]];
					}
				}
				for(re i=l/kuai+1;i<r/kuai;i++){
					if(chg[i]<=kuai){
						for(re j=i*kuai;j<MIN(n+1,(long long)(i+1)*kuai);j++)
							fa[j]=max(fa[j]-k,1);
						for(re j=i*kuai;j<MIN(n+1,(long long)(i+1)*kuai);j++){
							if(chg[j/kuai]<=kuai){
								if(fa[j]/kuai!=j/kuai)nx[j]=fa[j];
								else nx[j]=nx[fa[j]];
							}
						}
					}
					else{
						tag[i]+=k;
						if(tag[i]>n)tag[i]=n;
					}
					chg[i]++;
				}
			}
		}
		else{
			while(x!=y){
				int xx=NX(x),yy=NX(y);
				if(xx/kuai!=yy/kuai){
					if(xx/kuai<yy/kuai)y=yy;
					else x=xx;
				}
				else{
					if(xx!=yy){
						if(xx<yy)y=yy;
						else x=xx;
					}
					else{
						if(x<y)y=FA(y);
						else x=FA(x);
					}
				}
			}
			lstans=x;
			printf("%d\n",lstans);
		}
	}
}
2024/8/9 20:56
加载中...