咕咕咕0分求助
查看原帖
咕咕咕0分求助
73847
OYBDOOO楼主2020/6/5 14:22

咕咕咕0分求助,4wa6re,/kkl

#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
struct EDGE
{
	int v,next,quan;
}edge[maxn*2];
int ind[maxn];
int sz[maxn*33*2];
int ch[maxn*33*2][2];
int tma[maxn],tmb[maxn];
int fa[maxn][23];
int rt1[maxn],rt2[maxn];
int n,m;
int ww[maxn];
int tot=0,ttt=0,cnt=0;
void add(int aa,int bb)
{
	tot++;
	edge[tot].v=bb;
	edge[tot].next=ind[aa];
	ind[aa]=tot;
}
void psup(int x)
{
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]];
}
int dep[maxn];
void modi(int &x,int pre,int shu,int wei)
{
//	cerr<<ttt<<endl;
	if(x==0)x=++ttt;
	sz[x]=sz[pre];
	if(wei<0)
	{
		sz[x]++;
		return;
	}
	int w=((shu>>wei)&1);
	ch[x][!w]=ch[pre][!w];
	modi(ch[x][w],ch[pre][w],shu,wei-1);
	psup(x);
}
void dfs(int x,int fx)
{
//	cerr<<x<<endl;
	if(x==6)
		int my=-1; 
	tma[x]=++cnt;
	dep[x]=dep[fx]+1;
	fa[x][0]=fx;
	modi(rt1[tma[x]],rt1[tma[x]-1],ww[x],31);
	modi(rt2[x],rt2[fx],ww[x],31);
	for(int i=ind[x];i!=-1;i=edge[i].next)
	{
		if(fx==edge[i].v)continue;
		dfs(edge[i].v,x);
	}
	tmb[x]=cnt;
}
int que(int nl,int nr,int x,int wei)
{
	if(wei<0)return 0;
	int w=((x>>wei)&1);
	if(wei==1)
		int my=-1;
	if(sz[ch[nr][!w]]-sz[ch[nl][!w]])
		return (1<<wei)|que(ch[nl][!w],ch[nr][!w],x,wei-1);
	else return que(ch[nl][w],ch[nr][w],x,wei-1);
}
void wk()
{
	for(int j=1;j<=20;j++)
		for(int i=1;i<=n;i++)
			fa[i][j]=fa[fa[i][j-1]][j-1];
}
int lca(int x,int y)
{
	int i;
	if(dep[x]<dep[y])swap(x,y);
	for(i=20;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y])
			x=fa[x][i];
	if(x==y)return x;
	for(i=20;i>=0;i--)
		if(fa[x][i]==fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	return fa[x][0];
}
int main()
{
	freopen("e.in","r",stdin);
	freopen("e.out","w",stdout);
	int i,aa,bb,cc,opt;
	scanf("%d%d",&n,&m);
	memset(ind,-1,sizeof(ind));
	for(i=1;i<=n;i++)
		scanf("%d",&ww[i]);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&aa,&bb);
		add(aa,bb);
		add(bb,aa);
	}
	dfs(1,0);
	wk();
	for(i=1;i<=m;i++)
	{
		scanf("%d",&opt);
		if(opt==1)
		{
			scanf("%d%d",&aa,&bb);
			cout<<que(rt1[tma[aa]-1],rt1[tmb[aa]],bb,31)<<endl;
		}
		else
		{
			scanf("%d%d%d",&aa,&bb,&cc);
			int gz=fa[lca(aa,bb)][0];
			cout<<max(que(rt2[gz],rt2[aa],cc,31),que(rt2[gz],rt2[bb],cc,31))<<endl;
		}
	}
	return 0;
}
2020/6/5 14:22
加载中...