LG5311 成都七中

#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using int16=short;using uint16=unsigned short;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;
using float64=double;using float80=long double;constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){x<y?x=y:x;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){x>y?x=y:x;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10;int __test_num=1,__task_id,__tst;using namespace std;void __init();

int n,q,A[N],ans[N];vector<int> G[N];vector<array<int,3>> asks[N];

int tot,sz[N],CG,mxsz[N];bool calced[N];
int getsz(int rt,int fa=0){
	sz[rt]=1;
	for(int son:G[rt])if(son!=fa&&!calced[son])sz[rt]+=getsz(son,rt);
	return sz[rt];
}
void findCG(int rt,int fa=0){
	mxsz[rt]=tot-sz[rt];
	for(int son:G[rt])if(son!=fa&&!calced[son])chkMax(mxsz[rt],sz[son]),findCG(son,rt);
	if(mxsz[rt]<mxsz[CG])CG=rt;
}
bool vis[N];vector<array<int,3>> opts;int lst[N];
void dfs(int rt,int fa=0,int mn=INF,int mx=MINF){
	chkMin(mn,rt);chkMax(mx,rt);
	opts.pushb({mn,A[rt],mx});lst[A[rt]]=0;
	for(auto [qid,l,r]:asks[rt])if(!vis[qid]&&l<=mn&&mx<=r)opts.pushb({l,-qid,r}),vis[qid]=true;
	for(int son:G[rt])if(son!=fa&&!calced[son])dfs(son,rt,mn,mx);
}
int c[N];
void upd(int pos,int val){for(;pos<=n;pos+=pos&-pos)c[pos]+=val;}
int ask(int pos){int ans=0;for(;pos;pos-=pos&-pos)ans+=c[pos];return ans;}
void solve(int rt){
	tot=getsz(rt);
	CG=rt;findCG(rt);
	opts.clear();dfs(CG);sort(opts.begin(),opts.end(),greater<array<int,3>>());
	for(auto [l,qid,r]:opts){
		if(qid>0){
			if(lst[qid])upd(lst[qid],-1);
			else lst[qid]=r;
			upd(lst[qid]=min(lst[qid],r),1);
		}
		else ans[-qid]=ask(r);
	}
	for(auto [l,qid,r]:opts)if(qid>0&&lst[qid])upd(lst[qid],-1),lst[qid]=0;
	calced[CG]=true;
	for(int son:G[CG])if(!calced[son])solve(son);
}

bool __med;void __solve(int __test_id){
	cin>>n>>q;
	forUp(i,1,n)cin>>A[i];
	forUP(i,1,n){
		int u,v;cin>>u>>v;
		G[u].pushb(v);G[v].pushb(u);
	}
	forUp(i,1,q){
		int l,r,u;cin>>l>>r>>u;
		asks[u].pushb({i,l,r});
	}
	solve(1);
	forUp(i,1,q)cout<<ans[i]<<'\n';
}
signed main(){
    __init();
    forUp(i,1,__test_num)__solve(i);
    cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
    return 0;
}
void __init(){
    __tst=clock();
	#ifndef use_file
	//#define use_file
	#endif
	#ifdef use_file
    const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
	#endif
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//scanf("%d",&__test_num);
	//cin>>__task_id;
	//cin>>__test_num;
}
posted @ 2026-08-02 13:37  LXcjh4998  阅读(1)  评论(0)    收藏  举报