Submission #1350919

#TimeUsernameProblemLanguageResultExecution timeMemory
1350919altern23Klasika (COCI20_klasika)C++20
33 / 110
553 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int MAXN = 2e5;
const int INF = 1e18;

int t;
vector <int> adj[MAXN+5];
int tin[MAXN+5], tout[MAXN+5], dist[MAXN+5];
int X[MAXN+5], A[MAXN+5], B[MAXN+5];

struct Trie {
      int lvl, freq = 0;
      Trie *ch[2] = {NULL};

      void insert(int z) {
            freq++;
            if (!lvl) return;
            if (ch[(z>>lvl-1)&1] == NULL) {
                  ch[(z>>lvl-1)&1] = new Trie();
                  ch[(z>>lvl-1)&1]->lvl = lvl-1;
            }
            ch[(z>>lvl-1)&1]->insert(z);
      }

      int query(int z) {
            if (!lvl) return 0LL;
            if (ch[!((z>>lvl-1)&1)] != NULL) {
                  return (1LL<<lvl-1)+ch[!((z>>lvl-1)&1)]->query(z);
            }
            else if (ch[(z>>lvl-1)&1] != NULL) {
                  return ch[(z>>lvl-1)&1]->query(z);
            }
            return 0LL;
      }
};

struct ST {
      int l, r;
      ST *lf, *rg;
      Trie val;
      
      void build() {
            val.lvl = 30;
            if (l == r) return;
            int mid = (l+r)/2;
            lf = new ST(), rg = new ST();
            lf->l = l, lf->r = mid;
            rg->l = mid+1, rg->r = r;
            lf->build(), rg->build();
      }

      void update(int idx, int z) {
            val.insert(z);
            if (l == r) {
                  return;
            }
            int mid = (l+r)/2;
            if (idx <= mid) lf->update(idx, z);
            else rg->update(idx, z);
      }

      int query(int x, int y, int z) {
            if (l > y || r < x) return 0LL;
            if (l >= x && r <= y) return val.query(z);
            return max(lf->query(x, y, z), rg->query(x, y, z));
      }
};

void dfs(int idx) {
      tin[idx] = ++t;
      for (auto i : adj[idx]) {
            dfs(i);
      }
      tout[idx] = t;
}

int main() {
      ios_base::sync_with_stdio(0); cin.tie(0);
      int tc = 1;
      // cin >> tc;
      while (tc--) {
            int Q; cin >> Q;
            int N = 1;

            for (int i = 1; i <= Q; i++) {
                  string S; cin >> S;
                  if (S == "Add") {
                        int P, val; cin >> P >> val;
                        X[i] = ++N;
                        adj[P].push_back(N);
                        dist[N] = (dist[P]^val);
                  }
                  else {
                        cin >> A[i] >> B[i];
                  }
            }

            dfs(1);

            ST sg;
            sg.l = 1, sg.r = N;
            sg.build();

            sg.update(tin[1], 0);

            for (int i = 1; i <= Q; i++) {
                  if (X[i]) {
                        sg.update(tin[X[i]], dist[X[i]]);
                  }
                  else {
                        cout << sg.query(tin[B[i]], tout[B[i]], dist[A[i]]) << "\n";
                  }
            }
      }
}

/*

*/

Compilation message (stderr)

klasika.cpp:7:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
    7 | const int INF = 1e18;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...