제출 #1348077

#제출 시각아이디문제언어결과실행 시간메모리
1348077vladmart09Klasika (COCI20_klasika)C++20
33 / 110
686 ms416588 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <random>
#include <queue>
#include <numeric>
#include <array>
#include <iomanip>
#include <stack>
#include <chrono>
#include <climits>

using namespace std;

using ll = int;
using ld = long double;
using vi = vector<ll>;
using vii = vector<vi>;
using viii = vector<vii>;
using pi = pair<ll, ll>;
using vpi = vector<pi>;
using vb = vector<bool>;
using vs = vector<string>;

#define vec vector
#define cmax(x, y) x = max({x, y})
#define cmin(x, y) x = min({x, y})
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

const ll N = 2e5 + 5, MOD = 1e9 + 7, INF = (ll)1e18, K = 20;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

struct Query {
	string op;
	ll a, b;
};

struct node {
	ll one, zero;

	node() : one(0), zero(0) {}
};

node c[50'000'000];
ll cc = 1;

struct Trie {
	ll root;

	Trie() : root(cc++) {}

	void add(ll x) {
		ll cur = root;

		for (ll i = 30; i >= 0; i--) {
			if (x >> i & 1) {
				if (!c[cur].one) c[cur].one = cc++;

				cur = c[cur].one;
			}
			else {
				if (!c[cur].zero) c[cur].zero = cc++;

				cur = c[cur].zero;
			}
		}
	}

	ll best(ll x) {
		if (!c[root].zero && !c[root].one) return 0;

		ll cur = root;
		ll y = 0;

		for (ll i = 30; i >= 0; i--) {
			if (x >> i & 1) {
				if (c[cur].zero) {
					cur = c[cur].zero;
				}
				else {
					cur = c[cur].one;
					y |= (1 << i);
				}
			}
			else {
				if (c[cur].one) {
					cur = c[cur].one;
					y |= (1 << i);
				}
				else {
					cur = c[cur].zero;
				}
			}
		}

		return y ^ x;
	}
};

struct Seg {
	vector<Trie> seg;
	ll n;

	Seg(ll n_) : n(n_) {
		seg.resize(2 * n + 5);
	}

	void update(ll i, ll x) {
		i += n;

		for (; i > 0; i >>= 1) {
			seg[i].add(x);
		}
	}

	ll get(ll l, ll r, ll x) {
		l += n, r += n;

		ll res = 0;

		for (; l <= r; l >>= 1, r >>= 1) {
			if (l & 1) {
				cmax(res, seg[l].best(x));
				l++;
			}
			if (~r & 1) {
				cmax(res, seg[r].best(x));
				r--;
			}
		}

		return res;
	}
};

vi g[N];
ll tin[N], tout[N], timer = 1, val[N];

void dfs(ll v) {
	tin[v] = timer++;

	for (auto& x : g[v]) {
		dfs(x);
	}

	tout[v] = timer - 1;
}

void solve() {
	ll q; cin >> q;

	vector<Query> qu(q);

	ll sz = 1;
	for (ll i = 0; i < q; i++) {
		cin >> qu[i].op >> qu[i].a >> qu[i].b;

		if (qu[i].op == "Add") {
			sz++;
			g[qu[i].a].push_back(sz);
		}
	}

	dfs(1);

	ll n = sz;
	sz = 1;

	Seg seg(n);
	seg.update(tin[1], 0);

	for (ll i = 0; i < q; i++) {
		auto [op, a, b] = qu[i];

		if (op == "Add") {
			sz++;
			val[sz] = val[a] ^ b;
			seg.update(tin[sz], val[sz]);
		}
		else {
			cout << seg.get(tin[b], tout[b], val[a]) << '\n';
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	long long tt = 1;
	//cin >> tt;

	while (tt--) {
		solve();
		cout << '\n';
	}

	return 0;
}

/*




























Какие темы повторить:
1) мст
2) 2сат
3) точки артикуляции
4) ксор базис
5) эйлеровый цикл, путь
6) кмп
7) конвекс хулл
8) вафельное дерево
9) суфиксный массив
10) суффиксный автомат
11) ним

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...