为啥第113行编译错误
查看原帖
为啥第113行编译错误
490978
小超手123楼主2022/10/15 22:47
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int n,Q;
int a[maxn],dep[maxn],fa[maxn][50],lg[maxn],siz[maxn];
int dfn[maxn]; //dfs序
int wei[maxn],tot; //每个点在dfs序中的位置 
vector<int>p[maxn]; 
void dfs(int x,int father){
	a[x]^=a[father];
	dfn[++tot]=x;
	wei[x]=tot;
	siz[x]=1;
	fa[x][0]=father;
	dep[x]=dep[father]+1;
	for(int i=1;i<=lg[dep[x]-1];i++)
		fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=0;i<p[x].size();i++){
		int y=p[x][i];
		if(y==father)continue;
		dfs(y,x);
		siz[x]+=siz[y];
	}
}
int LCA(int x,int y){
	if(dep[y]>dep[x])swap(x,y);
	while(dep[x]>dep[y]) 
	    x=fa[x][lg[dep[x]-dep[y]]];
	if(x==y)return x;
	for(int i=lg[dep[x]];i>=0;i--)
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
		    y=fa[y][i];
		}
	return fa[x][0];
}
int w[maxn],lazy[maxn];
void pushup(int u){
	w[u]=w[u*2]^w[u*2+1];
}
void build(int u,int L,int R){
	if(L==R){
		w[u]=a[dfn[L]];
		return;
	}
	int mid=(L+R)/2;
	build(u*2,L,mid-1);
	build(u*2+1,mid,R);
	pushup(u);
}
bool InRange(int L,int R,int l,int r){
	return l<=L&&R<=r;
}
bool OutofRange(int L,int R,int l,int r){
	return r<=L||R<=l;
}
void maketag(int u,int L,int R,int x){
	int len=R-L+1;
	lazy[u]^=x;
	if(len%2==1)w[u]^=x; 
}
void pushdown(int u,int L,int R){
	int mid=(L+R)/2;
	maketag(u*2,L,mid,lazy[u]);
	maketag(u*2+1,mid+1,R,lazy[u]);
	lazy[u]=0;
}
int query(int u,int L,int R,int x){
	if(L==R)return w[u];
	int mid=(L+R)/2;
	pushdown(u,L,R);
	if(x<=mid)return query(u*2,L,mid,x);
	else return query(u*2+1,mid+1,R,x);
}
void update(int u,int L,int R,int l,int r,int x){ //将l~r都异或上x 
	if(OutofRange(L,R,l,r))return;
	if(InRange(L,R,l,r)){
		maketag(u,L,R,x);
		return;
	}
	int mid=(L+R)/2;
	pushdown(u,L,R);
	update(u*2,L,mid,l,r,x);
	update(u*2+1,mid+1,R,l,r,x);
	pushup(u); 
}
int main() {
	cin>>n>>Q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		p[u].push_back(v);
		p[v].push_back(u);
	}
	for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
	dfs(1,0); 
	build(1,1,n);
	memset(lazy,-1,sizeof(lazy));
	while(Q--){
		int opt;
		cin>>opt;
		if(opt==1){
			int x,y;
			cin>>x>>y;
			update(1,1,n,x,x+siz[x]-1,y);
		}
		if(opt==2){
			int x,y;
			cin>>x>>y;
			int lca=LCA(x,y);
			int nx=wei[x],ny=wei[y],nlca=wei[fa[lca][0]];
			cout<<query(1,1,n,nx)^query(1,1,n,ny)<<endl; 
			//=query(1,1,n,nx)^query(1,1,n,ny)^query(1,1,n,nlca)^query(1,1,n,nlca)
		}
	}
	return 0;
}
/*
5 3
2 1 3 2 2
1 2
2 3
2 4
1 5
2 2 5
*/
2022/10/15 22:47
加载中...