Submission #1189446

#TimeUsernameProblemLanguageResultExecution timeMemory
1189446UnforgettableplPrize (CEOI22_prize)C++20
0 / 100
1454 ms373080 KiB
#define _GLIBCXX_DEBUG 1
#include <bits/stdc++.h>
using namespace std;

#define int long long


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N,K,Q,T;
    cin >> N >> K >> Q >> T;
    vector<vector<int>> adj1(N+1);
    int root1;
    vector<vector<int>> adj2(N+1);
    int root2;
    for(int i=1;i<=N;i++){
        int p;cin>>p;
        if(p!=-1)adj1[p].emplace_back(i);
        else root1=i;
    }
    for(int i=1;i<=N;i++){
        int p;cin>>p;
        if(p!=-1)adj2[p].emplace_back(i);
        else root2=i;
    }
    // CHOOSE NODES
    vector<bool> choice(N+1);
    {
        int curr = 0;
        function<void(int)> dfs = [&](int x){
            if(curr<K){
                choice[x]=true;
                curr++;
                cout << x << ' ';
            }
            for(int&i:adj1[x])dfs(i);
        };
        dfs(root1);
        cout << endl;
    }
    // LCA setup
    

    vector<int> dfsOrder = {-1};
    vector<int> idx(N+1);
    {
        function<void(int)> dfs = [&](int x){
            if(choice[x]){
                idx[x]=dfsOrder.size();
                dfsOrder.emplace_back(x);
            }
            for(int&i:adj2[x])dfs(i);
        };
        dfs(root2);
    }
    vector<int> L(K+1);
    vector<int> R(K+1);
    vector<int> P(K+1);
    {
        for(int i=1;i<K;i++){
            cout << "? " << dfsOrder[i] << ' ' << dfsOrder[i+1] << '\n';
        }
        cout << "!" << endl;
        for(int i=1;i<K;i++){
            int d1a,d1b,d2a,d2b;
            cin >> d1a >> d1b >> d2a >> d2b;
            // TODO process tree 1
            R[i] = d2a;
            L[i+1] = d2b;
            P[i]=P[i-1]+R[i]-L[i];
        }
        P[K]=P[K-1]+R[K]-L[K];
    }
    auto solve2 = [&](int a,int b){
        a = idx[a];
        b = idx[b];
        if(a>b)swap(a,b);
        if(a==b)return 0ll;
        return R[a]+L[b]+P[b-1]-P[a];
    };
    {
        vector<pair<int,int>> queries(T);
        for(auto&[a,b]:queries)cin>>a>>b;
        for(auto&[a,b]:queries){
            // TODO answer for tree 1
            int ans1 = -1;
            int ans2 = solve2(a,b);
            ans1=ans2;
            cout << ans1 << ' ' << ans2 << '\n';
        }
    }
}
#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...