#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define Ls tree[now].ls
#define Rs tree[now].rs
#define V tree[now].v
#define N 100005
using namespace std;
int n,m,q;
//normal tree
vector <int> edge[N];
int fa[N],depth[N],maxdp;
void rendie(int now)
{
depth[now] = depth[fa[now]] + 1;
maxdp = max(maxdp,depth[now]);
for (int ch : edge[now])
{
if (ch == fa[now])
{
continue;
}
fa[ch] = now;
rendie(ch);
}
}
//seg tree
int root[N],next_root = 0,latest = 0;
struct Node{
int ls,rs;
long long v;
}tree[N * 40];
//instruction
struct Ins{
int node,cdp,adp,id,ans;//节点编号,染色深度,节点的深度,询问出现的顺序,答案
}ins[N];
bool cmp1(Ins i1,Ins i2)
{
return i1.adp > i2.adp;
}
bool cmp2(Ins i1,Ins i2)
{
return i1.id < i2.id;
}
void update(int now)
{
V = tree[Ls].v + tree[Rs].v;
}
void add(int &now,int q,int x,int l,int r)//geshu nage
{
if (now == 0)
{
now = ++latest;
}
if (l == r)
{
V += q;
return;
}
int mid = (l + r) / 2;
if (x <= mid)
{
add(Ls,q,x,l,mid);
}
else
{
add(Rs,q,x,mid + 1,r);
}
update(now);
}
void merge(int &now,int old,int l,int r)
{
if (old == 0 || now == 0)
{
now = now + old;
return;
}
if (l == r)
{
V = V + tree[old].v;
return;
}
int mid = (l + r) / 2;
merge(Ls,tree[old].ls,l,mid);
merge(Rs,tree[old].rs,mid + 1,r);
update(now);
}
void merge_node(int to,int node)
{
if (root[node] != 0)
{
merge(to,root[node],1,maxdp);
}
else
{
add(to,1,depth[node],1,maxdp);///
for (int ch : edge[node])
{
if (ch == fa[node])
{
continue;
}
merge_node(to,ch);
}
}
}
int sum(int now,int x,int y,int l,int r)
{
if (x <= l && r <= y)
{
return V;
}
long long ans = 0;
int mid = (l + r) / 2;
if (x <= mid)
{
ans += sum(Ls,x,y,l,mid);
}
if (y >= mid + 1)
{
ans += sum(Rs,x,y,mid + 1,r);
}
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for (int i = 1;i < n;i++)
{
int u,v;
scanf("%d %d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
rendie(1);
int coldp = 0x3f;//now color depth
for (int i = 1;i <= m;i++)
{
int opt,x;
scanf("%d %d",&opt,&x);
if (opt == 1)
{
coldp = x;
}
else
{
ins[q].id = q;
ins[q].cdp = coldp;
ins[q].node = x;
ins[q].adp = depth[x];
q++;
}
}
sort(ins,ins + q,cmp1);
for (int i = 0;i < q;i++)
{
if (root[ins[i].node] != 0)
{
if (ins[i].cdp > maxdp)
{
ins[i].ans = 0;
continue;
}
ins[i].ans = sum(root[ins[i].node],ins[i].cdp,maxdp,1,maxdp);
}
else
{
if (ins[i].cdp > maxdp)
{
ins[i].ans = 0;
continue;
}
root[ins[i].node] = ++latest;
add(root[ins[i].node],1,depth[ins[i].node],1,maxdp);
for (int ch : edge[ins[i].node])
{
if (ch == fa[ins[i].node])
{
continue;
}
merge_node(root[ins[i].node],ch);
}
ins[i].ans = sum(root[ins[i].node],ins[i].cdp,maxdp,1,maxdp);
}
}
sort(ins,ins + q,cmp2);
for (int i = 0;i < q;i++)
{
printf("%d\n",ins[i].ans);
}
return 0;
}
有几个点应该输出0,但是我好像输出了1开头的某个数(可能是1)。 真的调不动啦,自己造的测试点都过了,实在想不出来还有什么可能。 求大佬调调orz