Submission #936483

#TimeUsernameProblemLanguageResultExecution timeMemory
936483Edu175Prize (CEOI22_prize)C++17
10 / 100
2260 ms512616 KiB
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(ll i=a,ceoi=b;i<ceoi;i++)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define imp(v) for(auto kdjfhg:v)cout<<kdjfhg<<" ";cout<<"\n"
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const ll MAXN=1e6+5,K=20;

vector<ii> g[2][MAXN]; ll n; ll rt[2];
struct LCA{
	vector<vector<ll>>F,V; vector<ll>D;
	LCA(): F(K,vector<ll>(1<<K)),V(K,vector<ll>(1<<K)),D(MAXN){}
	void lca_dfs(ll x, ll z){
		for(auto [y,w]:g[z][x])if(y!=F[0][x]){
			F[0][y]=x;
			V[0][y]=w;
			D[y]=D[x]+1;
			lca_dfs(y,z);
		}
	}
	void lca_init(ll rt, ll z){
		D[rt]=V[0][rt]=0;F[0][rt]=-1;
		lca_dfs(rt,z);
		fore(k,1,K)fore(i,0,n){
			if(F[k-1][i]<0)F[k][i]=-1,V[k][i]=V[k-1][i];
			else {
				F[k][i]=F[k-1][F[k-1][i]];
				V[k][i]=V[k-1][i]+V[k-1][F[k-1][i]];
			}
		}
	}
	ii lca(ll x, ll y){
		if(D[x]<D[y])swap(x,y);
		ll res=0;
		for(ll k=K-1;k>=0;k--)if(D[x]-(1ll<<k)>=D[y]){
			res+=V[k][x];
			x=F[k][x];
		}
		//cout<<"iguales?\n";
		if(x==y)return {x,res};
		//cout<<"no\n";
		for(ll k=K-1;k>=0;k--)if(F[k][x]!=F[k][y]){
			res+=V[k][x]+V[k][y];
			x=F[k][x];
			y=F[k][y];
		}
		res+=V[0][x]+V[0][y];
		x=F[0][x];
		return {x,res};
	}
};

vector<ll>nod;
void dfs(ll x, ll z){
	nod.pb(x);
	for(auto [y,c]:g[z][x])dfs(y,z);
}
int main(){
	ll k,q,t; cin>>n>>k>>q>>t;
	fore(h,0,2)fore(i,0,n){
		ll p; cin>>p; p--;
		if(p<0)rt[h]=i;
		else g[h][p].pb({i,0});
	}
	dfs(rt[0],0);
	nod.resize(k);
	LCA G1;
	G1.lca_init(rt[0],0);
	vector<ll>pa(n);
	fore(i,0,n)pa[i]=G1.F[0][i];
	for(auto i:nod)cout<<i+1<<" ";;cout<<endl;
	for(auto i:nod)if(pa[i]>=0)
		cout<<"? "<<i+1<<" "<<pa[i]+1<<endl;
	cout<<"!"<<endl;
	fore(i,0,n)g[0][i].clear();
	fore(i,0,SZ(nod))if(pa[nod[i]]>=0){
		//cout<<"ingresa "<<i<<endl;
		ll w=0;
		fore(j,0,4){
			ll x; cin>>x;
			w=max(w,x);
		}
		g[0][pa[nod[i]]].pb({nod[i],w});
	}
	//cout<<"termina"<<endl;
	G1.lca_init(rt[0],0);
	vector<ii>ans;
	while(t--){
		ll x,y; cin>>x>>y; x--,y--;
		ll r=G1.lca(x,y).snd;
		ans.pb({r,r});
	}
	for(auto i:ans)cout<<i.fst<<" "<<i.snd<<endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...