RE 玄关求条
查看原帖
RE 玄关求条
1419569
Z_kazuha楼主2024/11/24 17:33
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
int n,m,cnt,head[N<<1],dfn[N],tim,siz[N],maxn,q[N];
vector<int> a[N],ask[N];
struct node{int to,nxt;}e[N<<1];
void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;}
void dfs(int x,int fa,int dep){
	dfn[x]=++tim;
	a[dep].push_back(tim);
	siz[x]=1;
	maxn=max(maxn,dep);
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==fa)continue;
		dfs(y,x,dep+1);
		siz[x]+=siz[y];
	}
}
int tot,ans[N],tree[N<<2];
void pushup(int p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void update(int p,int pl,int pr,int L){
	if(pl==pr){
		tree[p]++;
		return;
	}
	int mid=(pl+pr)>>1;
	if(L<=mid)update(ls(p),pl,mid,L);
	else update(rs(p),mid+1,pr,L);
	pushup(p);
}
int query(int p,int pl,int pr,int L,int R){
	if(pl>=L&&pr>=R)return tree[p];
	int mid=(pl+pr)>>1,res=0;
	if(L<=mid)res+=query(ls(p),pl,mid,L,R);
	if(R>mid)res+=query(rs(p),mid+1,pr,L,R);
	return res;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v),add(v,u);
	}
	dfs(1,1,1);
	int now=0;
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			cin>>now;
		}else{
			++tot;
			cin>>q[tot];
			ask[now].push_back(tot);
		}
	}
	for(int i=maxn;i;i--){
		for(auto j:a[i]){
			update(1,1,n,j);
		}
		for(auto j:ask[i]){
			int x=q[j];
			ans[j]=query(1,1,n,dfn[x],dfn[x]+siz[x]-1);
		}
	}
	for(int i=1;i<=tot;i++)cout<<ans[i]<<endl;
	return 0;
}
2024/11/24 17:33
加载中...