Submission #930767

#TimeUsernameProblemLanguageResultExecution timeMemory
930767WhisperKlasika (COCI20_klasika)C++17
110 / 110
2039 ms444640 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int long long #define FOR(i, a, b) for ( int i = a ; i <= b ; i++ ) #define FORD(i, a, b) for (int i = b; i >= a; i --) #define REP(i, n) for (int i = 0; i < n; ++i) #define REPD(i, n) for (int i = n - 1; i >= 0; --i) #define pii pair<int , int> #define fi first #define se second #define Lg(x) 31 - __builtin_clz(x) #define MASK(i) (1LL << (i)) #define BIT(x, i) (((x) >> (i)) & 1) constexpr ll LINF = (1ll << 60); constexpr int INF = (1ll << 30); constexpr int MAX = 2e5 + 5; constexpr int Mod = 1e9 + 7; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); void setupIO(){ #define name "Whisper" //Phu Trong from Nguyen Tat Thanh High School for gifted student srand(time(NULL)); cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr); //freopen(name".inp", "r", stdin); //freopen(name".out", "w", stdout); cout << fixed << setprecision(10); } template <class X, class Y> bool minimize(X &x, const Y &y){ X eps = 1e-9; if (x > y + eps) {x = y; return 1;} return 0; } template <class X, class Y> bool maximize(X &x, const Y &y){ X eps = 1e-9; if (x + eps < y) {x = y; return 1;} return 0; } int numQuery; vector<pii> adj[MAX]; struct Queries{ string c; int a, b; Queries(){} Queries(string _c, int _a, int _b): c(_c), a(_a), b(_b){} } qs[MAX]; struct Node{ Node *child[2]; set<int> passedNode; Node(){ child[0] = child[1] = nullptr; passedNode.clear(); } }; Node *root = new Node(); int tin[MAX], tout[MAX], f[MAX], cnt = 0; void dfs(int u, int p){ tin[u] = ++cnt; for (pair<int, int> x : adj[u]){ int v = x.first, w = x.second; f[v] = (f[u] ^ w); if (v ^ p){ dfs(v, u); } } tout[u] = cnt; } void Add(int node){ Node *p = root; int x = f[node]; REPD(i, 31){ int nxt = BIT(x, i); if (p -> child[nxt] == nullptr) p -> child[nxt] = new Node(); p = p -> child[nxt]; p -> passedNode.insert(tin[node]); } p -> passedNode.insert(tin[node]); } bool check(Node *p, int l, int r){ if (p -> passedNode.empty()) return 0; auto g = p -> passedNode.lower_bound(l); if (g == p -> passedNode.end()) return 0; return (*g) <= r; } int Ask(int node, int l, int r){ Node *p = root; int x = f[node]; int ans = 0; REPD(i, 31){ int nxt = BIT(x, i) ^ 1; if (p -> child[nxt] == nullptr || !check(p -> child[nxt], l, r)) nxt ^= 1; if (p -> child[nxt] == nullptr) return (ans ^ x); p = p -> child[nxt]; ans |= (nxt << i); } return (ans ^ x); } int numNode = 1; void Whisper(){ cin >> numQuery; for (int i = 1; i <= numQuery; ++i){ string c; int a, b; cin >> c >> a >> b; qs[i] = Queries(c, a, b); if (c == "Add"){ ++numNode; adj[a].push_back({numNode, b}); adj[numNode].push_back({a, b}); } } dfs(1, 0); numNode = 1; Add(numNode); for (int i = 1; i <= numQuery; ++i){ if (qs[i].c == "Add"){ Add(++numNode); } else{ cout << Ask(qs[i].a, tin[qs[i].b], tout[qs[i].b]) << '\n'; } } } signed main(){ setupIO(); int Test = 1; // cin >> Test; for ( int i = 1 ; i <= Test ; i++ ){ Whisper(); if (i < Test) cout << '\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...