从倍增改成树剖就wa了,问题应该在dfs和lca和get这几个函数中
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x;
}
const int N=5e5+5;
int n,m;
int t[N],c[N];
vector<int>col[N];
int head[N],to[N*2],nex[N*2],cnt;
void add(int u,int v){
cnt++;
to[cnt]=v;nex[cnt]=head[u];head[u]=cnt;
}
int fa[N][1],deep[N],tim,dfn[N],dfnr[N];
int son[N],top[N],sz[N];
void dfs(int x){
deep[x]=deep[fa[x][0]]+1;
sz[x]=1;
for(int i=head[x];i;i=nex[i]){
int y=to[i];if(y==fa[x][0])continue;
fa[y][0]=x;dfs(y);
sz[x]+=sz[y];
if(sz[y]>sz[son[x]])son[x]=y;
}
}
void dfs2(int x,int tp){
top[x]=tp;
dfn[x]=++tim;
if(!son[x])return;
dfs2(son[x],tp);
for(int i=head[x];i;i=nex[i]){
int y=to[i];
if(y==fa[x][0])continue;
if(y==son[x])continue;
dfs2(y,y);
}
dfnr[x]=tim;
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]>deep[top[y]])x=fa[top[x]][0];
else y=fa[top[y]][0];
}
if(x==0||y==0){
cout<<"asio";
exit(0);
}
return deep[x]>deep[y]?y:x;
}
bool cmp(int a,int b){
return dfn[a]<dfn[b];
}
struct node{
int x,w;
};
vector<node>ed[N];
vector<int>q[N];
int dian[N*2],len;
vector<int>g[N];
bool in(int u,int v){
if(dfn[v]<=dfn[u]&&dfn[v]+sz[v]>=dfn[u])return 1;
return 0;
}
int get(int u,int v){
while(deep[fa[top[u]][0]]>deep[v]){
u=fa[top[u]][0];
}
if(top[u]==top[v])return son[v];
else return top[u];
}
void add(int lu,int ru,int lv,int rv){
if(lv>rv||lu>ru)return;
// cout<<lu<<' '<<ru<<' '<<lv<<' '<<rv<<endl;
node book;
book.x=ru+1,book.w=-1;
ed[lv].push_back(book);
book.w=1;
ed[rv+1].push_back(book);
book.x=lu;
book.w=1;
ed[lv].push_back(book);
book.w=-1;
ed[rv+1].push_back(book);
}
void ins(int u,int v){
if(in(u,v)){
// cout<<1<<endl;
v=get(u,v);
add(dfn[u],dfnr[u],1,dfn[v]-1);add(dfn[u],dfnr[u],dfnr[v]+1,n);
}else if(in(v,u)){
// cout<<2<<endl;
u=get(v,u);
// cout<<u<<endl;
add(1,dfn[u]-1,dfn[v],dfnr[v]);add(dfnr[u]+1,n,dfn[v],dfnr[v]);
}else{
// cout<<3<<endl;
add(dfn[u],dfnr[u],dfn[v],dfnr[v]);
}
}
void df(int root,int x,int fa,int cnt){
if(c[x]==c[root]){
if(t[x]==1)cnt++;
else cnt--;
}
if(!cnt){
// cout<<"dasiojf"<<root<<' '<<x<<endl;
ins(root,x);return;
}
for(int i:g[x]){
if(i==fa)continue;
df(root,i,x,cnt);
}
}
vector<int>id[N];
int tree[N];
int lowbit(int x){
return x&(-x);
}
void update(int x,int w){
while(x<=n){
tree[x]+=w;
x+=lowbit(x);
}
}
int ask(int x){
int re=0;
while(x){
re+=tree[x];
x-=lowbit(x);
}
return re;
}
int ans[N*10];
int main(){
int num;
n=read();num=read();
for(int i=1;i<=n;i++){
t[i]=read();c[i]=read();
col[c[i]].push_back(i);
}
for(int u,v,i=1;i<n;i++){
u=read();v=read();add(u,v);add(v,u);
}
dfs(1);dfs2(1,1);
for(int i=1;i<=n;i++){
len=0;
if(col[i].size()==0)continue;
for(int j:col[i]){
++len;m=len;
dian[len]=j;
}
sort(dian+1,dian+1+m,cmp);
for(int j=1;j<m;j++){
dian[++len]=lca(dian[j],dian[j+1]);
}
dian[++len]=1;
sort(dian+1,dian+1+len);len=unique(dian+1,dian+1+len)-dian-1;
sort(dian+1,dian+1+len,cmp);
for(int i=1;i<len;i++){
g[lca(dian[i],dian[i+1])].push_back(dian[i+1]);
g[dian[i+1]].push_back(lca(dian[i],dian[i+1]));
}
// cout<<i<<endl;
for(int j=1;j<=len;j++){
if(t[dian[j]]==1&&c[dian[j]]==i){
df(dian[j],dian[j],0,0);
}
}
for(int i=1;i<=len;i++)g[dian[i]].clear();
}
for(int i=1;i<=num;i++){
int u,v;
u=read();v=read();
// cout<<"change"<<dfn[u]<<' '<<dfn[v]<<endl;
q[dfn[v]].push_back(dfn[u]);id[dfn[v]].push_back(i);
}
for(int i=1;i<=n;i++){
// cout<<i<<endl;
for(int k=0;k<ed[i].size();k++){
node j=ed[i][k];
if(j.x==0)continue;
// cout<<j.x<<' '<<j.w<<endl;
update(j.x,j.w);
}
for(int j=0;j<q[i].size();j++){
ans[id[i][j]]=ask(q[i][j]);
}
}
for(int i=1;i<=num;i++)cout<<ans[i]<<'\n';
return 0;
}