Submission #1236849

#TimeUsernameProblemLanguageResultExecution timeMemory
1236849caacrugonPrize (CEOI22_prize)C++20
0 / 100
189 ms76616 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

//data structures

typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<ll> vll;
typedef vector<ld> vld;
typedef pair<long long, long long> pll;
typedef pair<char, int> ci;
typedef pair<string, int> si;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<int>> vvi;
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define sz(a) ((int)a.size())
#define fi first
#define se second
#define whole(v) v.begin(), v.end()
#define rwhole(v) v.rbegin(), v.rend()
#define fro front
#define pqueue priority_queue
#define ubound upper_bound
#define lbound lower_bound
#define beg(v) v.begin()

//bit operations

int flip(int x){
    return ~(x) ^ (1 << 32);
}

int allon(int x){
    return (1LL << x) - 1;
}

bool bit(ll a, ll i){
    return (1LL << i) & a;
}

#define llpc(x) __builtin_popcountll(x)
#define ipc(x) __builtin_popcount(x)
#define iclz(x) __builtin_clz(x)
#define llclz(x) __builtin_clzll(x)
#define ictz(x) __builtin_ctz(x)
#define llctz(x) __builtin_ctzll(x)

//answers

#define cYES cout << "YES" << endl
#define cYes cout << "Yes" << endl
#define cyes cout << "yes" << endl
#define cNO cout << "NO" << endl
#define cNo cout << "No" << endl
#define cno cout << "no" << endl
#define ipsb cout << -1 << endl

const ll mod2 = 998244353;
const ll mod = 1000000007;
const int inf = int(1e9); // ll inf = ll(1e18);

// read arr vec matr etc

#define fill(x, y) memset(x, y, sizeof(x))

void read(vector<int> &x){
    for(auto &e:x) cin >> e;
}

void sread(vector<string> &x){
    for(auto &e:x) cin >> e;
}

void mread(vector<vector<int>> &p, int nnn, int mmm){
    for(int i = 0; i < nnn; ++i){
        vector<int> pp;
        for(int j = 0; j < mmm; ++j){
            int wq; cin >> wq; pp.pb(wq);
        }
        p.pb(pp);
    }
}

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //high quality random number generator using time as seed
//int random(int l, int r){return uniform_int_distribution<int>(l,r)(rng);} //returns a randomb number between [l, r]

// Solution

vi nodes;
void tc(){
    int n, k, q, t; cin >> n >> k >> q >> t;
    vi a(n), b(n);
    read(a); read(b);
    vvi eda(n);
    int root = 0;
    for(int i = 0; i < n; ++i){
        if(a[i] == -1){
            root = i;
        }else{
            eda[a[i]-1].pb(i);
        }
	      nodes.pb(i);
    }
    vi rootdist(n);
    rootdist[root] = 0;
    vi da(n);
    while(sz(nodes) > k){
        nodes.pop_back();
    }
    for(auto e:nodes){
        cout << e+1 << " ";
    }
    cout << '\n';
    vii queries;
    for(int i = 1; i < k; ++i){
        cout << "? " << nodes[i]+1 << " " << nodes[0]+1 << '\n';
        queries.pb({i, 0});
    }
    cout << "!" << '\n';
    cout<<flush;
    fflush(stdout);
    for(int i = 1; i < k; ++i){
        int e, f, g, h; cin >> e >> f >> g >> h;
        int u = nodes[queries[i-1].fi];
        int v = nodes[queries[i-1].se];
        if(da[u] < da[v]){
            swap(u, v);
        }
        rootdist[u] = e; // calculates all distance from root on the first tree(the joint one)
        //setree.join(u, v, g, h, stb); //uses graph structure to create the lca tree from the second tree, join erase a big edge, add a node, and join 2 small edges to the initial points
    }

    //setree.create(); //crate sum sparse table
    for(int i = 0; i < t; ++i){
        int u, v; cin >> u >> v;
        u--;
        v--;
       
        cout << rootdist[u] + rootdist[v] - 2 * rootdist[0] << " ";
        cout << rootdist[u] + rootdist[v] - 2 * rootdist[0] << " ";
        cout << '\n';
    }
    cout<<flush;
    fflush(stdout);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int t = 1;
    while(t--){
        tc();
    }
}

Compilation message (stderr)

Main.cpp: In function 'int flip(int)':
Main.cpp:38:22: warning: left shift count >= width of type [-Wshift-count-overflow]
   38 |     return ~(x) ^ (1 << 32);
      |                    ~~^~~~~
#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...