不会写代码,CE求调
查看原帖
不会写代码,CE求调
993404
harmis_yz楼主2023/10/5 18:37

IDE上用C++98能编译,但是交上去就CE了,不知道为啥pwp

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re  
#define il  

int n,m,ne[200050],e[200050],h[200050],idx;
struct node{
	int l,r,k,lc,id;
}Q[200050];int len,ans[200050];
int m_n[200050],sum[200050],val[200050],b[200050],num,c[200050];
int dfsx[200050],fi[200050],se[200050],cnt;
int dep[200050],f[200050][25];
bool vis[200050];

il void add(int a,int b){ne[++idx]=h[a],e[idx]=b,h[a]=idx;}
il void dfs(int now,int fa){
	dfsx[++cnt]=now,fi[now]=cnt,dep[now]=dep[fa]+1,f[now][0]=fa;
	for(re int i=1;i<24;++i) f[now][i]=f[f[now][i-1]][i-1];
	for(re int i=h[now];i;i=ne[i]){
		int j=e[i];if(j==fa) continue;
		dfs(j,now);
	}
	dfsx[++cnt]=now,se[now]=cnt;
}
il int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(re int i=23;i>=0;--i) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(re int i=23;i>=0;--i) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}

il bool cmp(node a,node b){
	if(a.l/len!=b.l/len) return a.l<b.l;
	if((a.l/len)&1) return a.r<b.r;
	return a.r>b.r;
}
il int get(int x){return (x-1)/len+1;}
il int kth(int k){
	for(re int bk=1;bk<=get(n);++bk)
		if(k>sum[bk]) k-=sum[bk];
		else for(re int i=(bk-1)*len+1;i<=bk*len;++i){
			k-=m_n[i];if(k<=0) return c[i];
		}
	return -1;
}
il void add(int x){++m_n[val[x]],++sum[get(val[x])];}
il void del(int x){--m_n[val[x]],--sum[get(val[x])];}
il void upd(int x){
	if(!vis[x]) add(x);
	else del(x);
	vis[x]^=1;
}
il void Solve(){
	int l=1,r=0;
	for(re int i=1;i<=m;++i){
		while(l>Q[i].l) upd(dfsx[--l]);
		while(r<Q[i].r) upd(dfsx[++r]);
		while(l<Q[i].l) upd(dfsx[l++]);
		while(r>Q[i].r) upd(dfsx[r--]);
		if(Q[i].lc) upd(Q[i].lc);
		ans[Q[i].id]=kth(Q[i].k);
		if(Q[i].lc) upd(Q[i].lc);
	}
}

il void read(){
	cin>>n>>m;
	for(re int i=1;i<=n;++i) cin>>val[i],b[++num]=val[i];
	sort(b+1,b+num+1),num=unique(b+1,b+num+1)-(b+1);
	for(re int i=1;i<=n;++i) val[i]=lower_bound(b+1,b+num+1,val[i])-b,c[val[i]]=b[val[i]];
	for(re int i=1,u,v;i<n;++i) cin>>u>>v,add(u,v),add(v,u);
}
il void solve(){
	dfs(1,0);
	for(re int i=1;i<=m;++i){
		int l,r,k;cin>>l>>r>>k;
		int lc=lca(l,r);
		if(fi[l]>fi[r]) swap(l,r);
		if(lc==l) Q[i]={fi[l],fi[r],k,0,i};
		else Q[i]={se[l],fi[r],k,lc,i};
	}
	len=sqrt(n*2);sort(Q+1,Q+m+1,cmp);
	Solve();
	for(re int i=1;i<=m;++i) cout<<ans[i]<<"\n";
}

signed main(){
	read(),solve();return 0;
}
2023/10/5 18:37
加载中...