感觉非常的没有什么问题,但是WA了。
#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=2e5+10;
const int mod=1e9+7;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
int n,m,a[maxn],b[maxn],f[maxn];
int len,lft[maxn],rht[maxn],pos[maxn],sum[maxn];
inline int find(int x){
if(f[x]==x)return x;
return f[x]=find(f[x]);
}
inline int ask(int x){
if(find(x)==x)return b[x];
return max(0,a[x]-sum[pos[x]]);
}
int s1[maxn],s2[maxn],t1,t2;
inline int lca(int x,int y){
s1[t1=1]=x;s2[t2=1]=y;
while(x!=y){
//printf("%d %d\n",x,y);
if(x>y)x=ask(x),s1[++t1]=x;
else y=ask(y),s2[++t2]=y;
}x=s1[max(1,t1-1)],y=s2[max(1,t2-1)];
//puts("over");
while(x!=y){
//printf("%d %d\n",x,y);
if(x>y)x=max(1,a[x]-sum[pos[x]]);
else y=max(1,a[y]-sum[pos[y]]);
}return x;
}
inline void modify(int l,int r,int x){
for(int i=l;i<=rht[pos[l]]&&i<=r;i++){
a[i]-=x;
if(pos[max(0,a[i]-sum[pos[i]])]!=pos[i])f[i]=find(i+1);
else b[i]=ask(a[i]-sum[pos[i]]);
}if(pos[l]==pos[r])return;
for(int i=pos[l]+1;i<pos[r];i++){
sum[i]+=x;
for(int j=lft[i];j<=rht[i];j++){
j=find(j);if(j>rht[i])break;
if(pos[max(0,a[j]-sum[i])]!=pos[j])f[j]=find(j+1);
else b[j]=ask(a[j]-sum[i]);
}
}
for(int i=lft[pos[r]];i<=r;i++){
a[i]-=x;
if(pos[max(0,a[i]-sum[pos[i]])]!=pos[i])f[i]=find(i+1);
else b[i]=ask(a[i]-sum[pos[i]]);
}
}
int main(){
n=read(),m=read();
len=sqrt(n)+1;
for(int i=1;i<=len;i++){
lft[i]=(i-1)*len+1;rht[i]=i*len;
if(rht[i]>n)rht[i]=n;
for(int j=lft[i];j<=rht[i];j++)pos[j]=i;
}
for(int i=2;i<=n;i++)a[i]=read();
for(int i=1;i<=n+1;i++)f[i]=i;
for(int i=1;i<=n;i++)
if(pos[a[i]]!=pos[i])b[i]=a[i],f[i]=i+1;
else b[i]=b[a[i]];
//for(int i=1;i<=n;i++)
// printf("%d ",pos[i]);puts("");
//for(int i=1;i<=n;i++)
// printf("%d ",b[i]);puts("");
int opt,x,y,z;
for(int i=1;i<=m;i++){
opt=read(),x=read(),y=read();
if(opt==1)z=read(),modify(x,y,z);
else printf("%d\n",lca(x,y));
}
return 0;
}
求查错,谢谢,谢谢,谢谢!!!