RT.提交记录https://www.luogu.com.cn/record/182811365
应该是下标越界,但是蒟蒻看不出来是哪里越界了,求助,万分感谢orzorz
#include<bits/stdc++.h>
// #define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=1e5+7,inf=0x3f3f3f3f;
int n,m,u,v,w,k,op;
int ans;
struct edge {
int to,ne;
}e[N<<1];
int head[N],cnt;
int val[N];
void addedge(int u,int v) { e[++cnt]={v,head[u]}; head[u]=cnt; }
int st[N][20],dfn[N];
int gfa[N];
int sz[N],dep[N];
void dfs(int u,int f) {
dep[u]=dep[f]+1;dfn[u]=++dfn[0];st[dfn[0]][0]=f;
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
}
}
int lcamin(int x,int y) { return dfn[x]<dfn[y]?x:y; }
void initlca() {
int lg=__lg(n);
rep(k,1,lg) for(int i=1;i+(1<<k)-1<=n;i++) st[i][k]=lcamin(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
int getlca(int u,int v) {
if(u==v) return u;
int mnx=min(dfn[u],dfn[v])+1,mxx=max(dfn[u],dfn[v]);
int lg=__lg(mxx-mnx+1);
return lcamin(st[mnx][lg],st[mxx-(1<<lg)+1][lg]);
}
int rt,mnrt;
void _max(int &a,int b) { a=max(a,b); }
void _min(int &a,int b) { a=min(a,b); }
bool del[N];
int getdis(int u,int v) {
int lca=getlca(u,v);
return dep[u]+dep[v]-2*dep[lca];
}
int sum;
void getroot(int u,int f) {
// pf("getroot %d %d %d\n",szx,u,f);
sz[u]=1;
int mx=0;
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(v==f||del[v]) continue;
getroot(v,u);
sz[u]+=sz[v];
_max(mx,sz[v]);
}
_max(mx,sum-sz[u]);
if(mx<mnrt) rt=u,mnrt=mx;
}
vector<int> tr[2][N];
void buildshu(int u) {
// pf("buildshu %d\n",u);
del[u]=1;
sz[u]=sum+1;
tr[0][u].resize(sz[u]);
tr[1][u].resize(sz[u]);
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(del[v]) continue;
sum=sz[v];
rt=0; mnrt=inf;
getroot(v,0);
gfa[rt]=u;
buildshu(rt);
}
}
void add(vector<int> &tr,int x,int val) {
// pf("add %d\n",x);
int n=tr.size();
x++;
for(;x<=n;x+=x&-x) tr[x-1]+=val;
// pf("exit add\n");
}
int ask(vector<int> &tr,int x) {
int s=0;
x++;
_min(x,tr.size());
for(;x;x-=x&-x) s+=tr[x-1];
return s;
}
void modify(int x,int val) {
// pf("modify %d\n",u);
for(int u=x;u;u=gfa[u]) add(tr[0][u],getdis(x,u),val);
for(int u=x;gfa[u];u=gfa[u]) add(tr[1][u],getdis(x,gfa[u]),w);
}
int query(int x,int k) {
int s=0;
s+=ask(tr[0][x],k);
for(int u=x;gfa[u];u=gfa[u]) {
int d=getdis(x,gfa[u]);
if(k>=d) s+=ask(tr[0][gfa[u]],k-d)-ask(tr[1][u],k-d);
}
return s;
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
// freopen("my.out","w",stdout);
#endif
sf("%d%d",&n,&m);
rep(i,1,n) sf("%d",&val[i]);
rep(i,1,n-1) sf("%d%d",&u,&v), addedge(u,v),addedge(v,u);
dfs(1,0);
initlca();
sum=n;
mnrt=inf;
getroot(1,0);
buildshu(rt);
// rep(i,1,n) pf("%d ",gfa[i]); pf("\n");
rep(i,1,n) modify(i,val[i]);
// rep(i,1,n) { for(int x:tr[i]) pf("%d ",x); pf("\n"); }
rep(i,1,m) {
sf("%d%d%d",&op,&u,&k);
u^=ans,k^=ans;
if(op==0) {
ans=query(u,k);
pf("%d\n",ans);
}else{
modify(u,k-val[u]); val[u]=k;
}
}
}