제출 #1356417

#제출 시각아이디문제언어결과실행 시간메모리
1356417CutSandstoneKlasika (COCI20_klasika)C++20
0 / 110
401 ms359872 KiB
#include <bits/stdc++.h>
using namespace std;
#define a first
#define b second
const int mod = 1e9 + 7;
const int inv2 = (mod + 1) / 2;
using ll = long long;
const int N = 2e5 + 1;
vector<int> g[N];
int w[N];
int qe[N][2];
int st[N], en[N];
int n = 1;
int pt = 0;
void dfs(int s) {
	st[s] = pt++;
	for (int i : g[s]) dfs(i);
	en[s] = pt - 1;
}
int trie[N * 31][2];
set<int> pos[N * 31];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int q;
	cin >> q;
	for (int i = 0; i < q; i++) {
		string s;
		cin >> s;
		int a, b;
		cin >> a >> b;
		a--;
		if (s == "Add") {
			g[a].push_back(n);
			qe[i][0] = n;
			w[n++] = w[a] ^ b;
			qe[i][1] = -1;
		} else {
			qe[i][0] = a;
			qe[i][1] = b - 1;
		}
	}
	dfs(0);
	pt = 1;
	trie[0][0] = trie[0][1] = -1;
	for (int i = 0; i < q; i++) {
		if (qe[i][1] == -1) {
			int p = 0;
			for (int j = 29; j >= 0; j--) {
				bool b = (w[qe[i][0]] >> j) & 1;
				if (trie[p][b] == -1) {
					trie[pt][0] = trie[pt][1] = -1;
					trie[p][b] = pt++;
				}
				p = trie[p][b];
				pos[p].insert(st[qe[i][0]]);
			}
		} else {
			int ans = 0;
			int p = 0;
			for (int j = 29; j >= 0; j--) {
				bool b = !((w[qe[i][0]] >> j) & 1);
				if (trie[p][b] == -1)
					b = !b;
				else {
					int ind = trie[p][b];
					auto nx = pos[ind].lower_bound(st[qe[i][1]]);
					if (nx == pos[ind].end() || *nx > en[qe[i][1]])
						b = !b;
					else
						ans ^= 1 << j;
				}
				p = trie[p][b];
			}
			cout << ans << "\n";
		}
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…