拍了一个早上了,还没找到问题:(。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+10;
int b[N];
int n,m;
int h[N],e[N*4],ne[N*4],idx;
int dep[N],top[N],sz[N],fa[N],son[N];
int Id[N],w[N],nw[N],cnt;
int ans[N];
struct color{
int c,pos;
}c[N];
int k=1;
struct question{
int l,r,c,id;
}q[N];
bool cmp(question a,question b){
return a.c<b.c;
}
bool cmp1(color a,color b){
return a.c<b.c;
}
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs_son(int u,int f,int d){
dep[u]=d,sz[u]=1,fa[u]=f;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==f)continue;
dfs_son(j,u,d+1);
sz[u]+=sz[j];
if(sz[son[u]]<sz[j])son[u]=j;
}
}
void dfs(int u,int t){
top[u]=t,Id[u]=++cnt;
if(!son[u])return;
dfs(son[u],t);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa[u]||j==son[u])continue;
dfs(j,j);
}
}
struct node{
int l,r,m;
}tr[N*4];
void pushup(int u){
tr[u].m=max(tr[u<<1].m,tr[u<<1|1].m);
}
void build(int u,int l,int r){
tr[u]={l,r,-1};
if(l==r)return;
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
void modify(int u,int pos,int k){
if(tr[u].l==tr[u].r){
tr[u].m=k;
return;
}
int mid=(tr[u].l+tr[u].r)>>1;
if(pos<=mid)modify(u<<1,pos,k);
else modify(u<<1|1,pos,k);
pushup(u);
}
int query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r){
return tr[u].m;
}
int mid=(tr[u].l+tr[u].r)>>1;
int ans=-1;
if(l<=mid)ans=max(ans,query(u<<1,l,r));
if(r>mid)ans=max(ans,query(u<<1|1,l,r));
return ans;
}
int query_path(int u,int v){
int ans=-1;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
ans=max(ans,query(1,Id[top[u]],Id[u]));
u=fa[top[u]];
}
if(dep[u]<dep[v])swap(u,v);
ans=max(ans,query(1,Id[v],Id[u]));
return ans;
}
void clear(int n){
idx=cnt=0;
k=1;
for(int i=1;i<=n+1;i++){
h[i]=ans[i]=-1;
son[i]=dep[i]=fa[i]=sz[i]=top[i]=Id[i]=w[i]=nw[i]=b[i]=0;
q[i]={0,0,0,0};
c[i]={0,0};
}
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
while(~scanf("%d%d",&n,&m)){
clear(n);
for(int i=1;i<=n;i++){
int a;
cin>>a;
a++;
c[i]={a,i};
b[a]=1;
}
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs_son(1,-1,1);
dfs(1,-1);
build(1,0,n);
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
c++;
q[i]={a,b,c,i};
}
sort(q+1,q+1+m,cmp);
sort(c+1,c+1+n,cmp1);
for(int i=1;i<=m;i++){
int l=q[i].l,r=q[i].r,color=q[i].c,id=q[i].id;
if(!b[color])ans[id]=0;
else{
while(c[k].c<color&&k<=n)k++;
while(c[k].c==color&&k<=n){
modify(1,Id[c[k].pos],color);
k++;
}
ans[id]=(query_path(l,r)==color);
}
}
for(int i=1;i<=m;i++){
if(ans[i])cout<<"Find"<<'\n';
else cout<<"NotFind"<<'\n';
}
cout<<'\n';
}
cout<<'\n';
return 0;
}