权值线段树+树链剖分 WA 20pts 求调
查看原帖
权值线段树+树链剖分 WA 20pts 求调
933802
ICU152_lowa_IS8楼主2024/11/29 22:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
struct edg{
	int v,next;
}edge[1000005];
int num,head[1000005];
int f[1000005];
void add(int u,int v){
	edge[++num].next=head[u];
	head[u]=num;
	edge[num].v=v;
}
int fa[1000005],siz[1000005],son[1000005],dep[1000005];
int id[1000005],cnt,top[1000005];
struct node{
	int val;
}tree[1000005<<2];
inline void pushup(int p){
	tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}
inline void update(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql)return;
	if(l>=ql&&r<=qr){
		if(l!=r)exit(1);
		tree[p].val=1;
		return;
	}
	int mid=l+r>>1;
	update(p<<1,l,mid,ql,qr);
	update(p<<1|1,mid+1,r,ql,qr);
	pushup(p);
}
inline int query(int p,int l,int r,int ql,int qr){
	if(l==r)return l;
	int mid=l+r>>1;
	int t=-1;
	if(tree[p<<1|1].val>0&&!(mid+1>qr||r<ql)){
		t=query(p<<1|1,mid+1,r,ql,qr);
	}
	else if(tree[p<<1].val>0&&!(l>qr||mid+1<ql)){
		t=query(p<<1,l,mid,ql,qr);
	}
	return t;
}
void dfs1(int now,int fath,int deep){
	siz[now]=1;
	dep[now]=deep;
	fa[now]=fath;
	int maxson=-1;
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].v;
		if(v==fath)continue;
		dfs1(v,now,deep+1);
		if(siz[v]>maxson){
			maxson=siz[v];
			son[now]=v;
		}
		siz[now]+=siz[v];
	}
}
void dfs2(int now,int topf){
	id[now]=++cnt;
	f[id[now]]=now;
	top[now]=topf;
	if(!son[now])return;
	dfs2(son[now],topf);
	for(int i=head[now];i;i=edge[i].next){
		int v=edge[i].v;
		if(v==son[now]||v==fa[now])continue;
		dfs2(v,v);
	}
}
inline int  qrange(int x,int y){
	int ans=1;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=max(ans,query(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans=max(ans,query(1,1,n,id[x],id[y]));
	return ans;
}
signed main(){
	cin>>n>>q;
//	exit(n);
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	update(1,1,n,1,1);
	while(q--){
		char op;
		int x;
		cin>>op>>x;
		if(op=='C'){
			update(1,1,n,id[x],id[x]);
		}
		else{
			cout<<f[qrange(1,x)]<<"\n";
		}
	}
	return 0;
}
2024/11/29 22:38
加载中...