VScode 报错信息:
在初始化树剖的时候就已经炸了,救救孩子吧,调了好久了。
#include <bits/stdc++.h>
#define int long long
#define ls (son[x][0])
#define rs (son[x][1])
#define mid ((l+r)>>1)
using namespace std;
namespace IO
{
char buff[1<<21],*p1=buff,*p2=buff;
char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
template<typename T>
void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
template<typename T,typename ...Args>
void read(T &x,Args& ...args){read(x);read(args...);}
char obuf[1<<21],*p3=obuf;
void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
char ch[100];
template<typename T>
void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
template<typename T,typename ...Args>
void write(T x,Args ...args) {write(x);write(args...);}
void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
void flush(){fwrite(obuf,p3-obuf,1,stdout);}
void End(){flush();exit(0);}
}
using namespace IO;
const int N=1e5+5,M=N*80;
int n,m,val[N];
vector<int> V[N];
struct Tree{
//-------线段树
int root[N],cnt=0;
int tr[M],lazy[M],son[M][2];
void pushup(int x){
tr[x]=tr[ls]+tr[rs];
}
int change(int x,int l,int r,int k,int v){
if(!x) x=++cnt;
if(l==r){
tr[x]+=v;
return x;
}
if(k<=mid) son[x][0]=change(ls,l,mid,k,v);
else son[x][1]=change(rs,mid+1,r,k,v);
pushup(x);
return x;
}
int query(int x,int l,int r,int lt,int rt){
if(l>=lt && r<=rt)return tr[x];
int ans=0;
if(lt<=mid) ans+=query(ls,l,mid,lt,rt);
if(rt >mid) ans+=query(rs,mid+1,r,lt,rt);
return ans;
}
void add(int x,int d,int w){
root[x] = change(root[x],0,n,d,w);
}
int Sum(int x,int s,int t){
return query(root[x],0,n,s,t);
}
}f1,f2;
namespace Lca{
//---------树剖
int fap[N],dep[N],son[N],siz[N],top[N];
void dfs1(int x,int f,int de){
fap[x]=f;
siz[x]=1;
// cout << de << "\n";
dep[x]=dep[f]+1;
int fat=-1;
for(auto v:V[x]){
// int v=V[x][i];
if(v==f) continue;
dfs1(v,x,de+1);
siz[x]+=siz[v];
if(siz[v]>fat) fat=siz[v],son[x]=v;
}
}
void dfs2(int x,int tp){
top[x]=tp;
if(!son[x]) return;
dfs2(son[x],tp);
for(auto v:V[x]){
if(v==fap[x] || v==son[x]) continue;
dfs2(v,v);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fap[top[x]];
}
return dep[x]<dep[y]?x:y;
}
int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
//--------点分树
int rt,Mx[N],sizp[N];
int vis[N],sum,fa[N];
void get_rt(int x,int f){
sizp[x]=1;
for(int v:V[x]){
if(vis[v] || v==f) continue;
get_rt(v,x);
sizp[x]+=sizp[v];
Mx[x]=max(Mx[x],sizp[v]);
}
Mx[x]=max(Mx[x],sum-sizp[x]);
if(Mx[x]<Mx[rt]) rt=x;
}
void update(int x,int w){
for(int i=x;i;i=fa[i]){
f1.add(i,Lca::dis(x,i),w);
}
for(int i=x;fa[i];i=fa[i]){
f2.add(i,Lca::dis(x,fa[i]),w);
}
}
void get_tree(int x,int f,int dep){
fa[x]=f;vis[x]=1;
update(x,val[x]);
for(auto v:V[x]){
if(vis[v]) continue;
Mx[rt=0]=1e9;
sum=siz[v];
get_rt(v,x);
get_tree(rt,x,dep+1);
}
}
void init(){
dfs1(1,0,1);dfs2(1,1);
Mx[0]=1e9;
rt=0;
sum=n;
get_rt(1,0);
get_tree(rt,0,0);
}
int query(int x,int k){
int ans=f1.Sum(x,0,k);
for(int i=x;fa[i];i=fa[i]){
if(k-Lca::dis(x,i)>=0){
ans-=f2.Sum(i,0,k-Lca::dis(x,fa[i]));
ans+=f1.Sum(fa[i],0,k-Lca::dis(x,fa[i]));
}
}return ans;
}
}
void update(int x,int v){
update(x,-val[x]);
update(x,v);
val[x]=v;
}
signed main(){
// freopen("P6329_1.in","r",stdin);
read(n,m);
for(int i=1;i<=n;i++) read(val[i]);
for(int i=1,u,v;i<n;i++){
read(u,v);
V[u].push_back(v);
V[v].push_back(u);
}
Lca::init();
int lst=0;
while(m--){
int opt,x,k;
read(opt,x,k);
x^=lst;
k^=lst;
if(opt==0){
write(lst=Lca::query(x,k));
putch('\n');
}else{
update(x,k);
}
}
End();
}