Submission #844936

# Submission time Handle Problem Language Result Execution time Memory
844936 2023-09-06T09:29:05 Z serifefedartar Klasika (COCI20_klasika) C++17
33 / 110
1461 ms 524288 KB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 20;
const ll MAXN = 2e5 + 5;
 
vector<pair<int,pair<int,int>>> queries;
vector<vector<int>> graph;
vector<set<int>> sets;
vector<int> val;
int tin[MAXN], tout[MAXN];
 
struct Node {
	Node *to[2];
	int id;
	Node () {
		to[0] = NULL;
		to[1] = NULL;
	}
};
 
int T = 0;
void dfs(int node, int parent) {
	tin[node] = ++T;
	for (auto u : graph[node])
		dfs(u, node);
	tout[node] = T;
}
 
bool check(Node *node, int subtree) {
	int st = tin[subtree];
	int en = tout[subtree];
	auto u = sets[node->id].lower_bound(st);
	if (u == sets[node->id].end() || *u > en)
		return false;
	return true;
}
 
int solve(Node *node, int subtree, int val) {
	int ans = 0;
	for (int i = 31; i >= 0; i--) {
		bool bit = ((1<<i) & val) != 0;
		if (node->to[!bit] != NULL && check(node->to[!bit], subtree)) {
			ans += (1<<i);
			node = node->to[!bit];
		} else if (node->to[bit] != NULL && check(node->to[bit], subtree))
			node = node->to[bit];
		else
			return 0; 
	}
	return ans;
}
 
int main() {
	fast
	int Q;
	cin >> Q;
 
	queries = vector<pair<int,pair<int,int>>>(Q);
	graph = vector<vector<int>>(Q+5, vector<int>());
	val = vector<int>(Q+5, 0);
	int nodes = 1, a, b;
	string type;
	for (int i = 0; i < Q; i++) {
		cin >> type >> a >> b;
 
		if (type == "Add") {
			nodes++;
			val[nodes] = (val[a] ^ b);
			queries[i] = make_pair(1, make_pair(nodes, val[nodes]));
			graph[a].push_back(nodes);
		} else
			queries[i] = make_pair(0, make_pair(a, b));
	}
	dfs(1, 1);
 	
 	sets = vector<set<int>>(50*nodes, set<int>());
	Node *root = new Node();
	root->id = 1;
	int ids = 1;
	Node *now2 = root;
	sets[now2->id].insert(1);
	for (int i = 31; i >= 0; i--) {
				bool bit = 0;
				if (now2->to[bit] == NULL) {
					now2->to[bit] = new Node();
					now2->to[bit]->id = ++ids;
				}
				now2 = now2->to[bit];
				sets[now2->id].insert(1);
	}

	for (auto u : queries) {
		if (u.f) {
			Node *now = root;
			sets[now->id].insert(tin[u.s.f]);
			int x = u.s.s;
			for (int i = 31; i >= 0; i--) {
				bool bit = ((1<<i) & x) != 0;
				if (now->to[bit] == NULL) {
					now->to[bit] = new Node();
					now->to[bit]->id = ++ids;
				}
				now = now->to[bit];
				sets[now->id].insert(tin[u.s.f]);
			}
		} else {
			int node = u.s.f; 
			int subtree = u.s.s;
			Node *now = root;
			cout << solve(now, subtree, val[node]) << "\n";
		}
	}
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 1 ms 856 KB Output is correct
3 Correct 1 ms 860 KB Output is correct
4 Correct 1 ms 1116 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 860 KB Output is correct
8 Correct 1 ms 1116 KB Output is correct
9 Correct 1 ms 604 KB Output is correct
10 Correct 1 ms 860 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 968 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 1 ms 856 KB Output is correct
3 Correct 1 ms 860 KB Output is correct
4 Correct 1 ms 1116 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 860 KB Output is correct
8 Correct 1 ms 1116 KB Output is correct
9 Correct 1 ms 604 KB Output is correct
10 Correct 1 ms 860 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 968 KB Output is correct
13 Correct 4 ms 2396 KB Output is correct
14 Correct 5 ms 4188 KB Output is correct
15 Correct 6 ms 6236 KB Output is correct
16 Correct 7 ms 7772 KB Output is correct
17 Correct 4 ms 2396 KB Output is correct
18 Correct 5 ms 4104 KB Output is correct
19 Correct 7 ms 5980 KB Output is correct
20 Correct 8 ms 7740 KB Output is correct
21 Correct 4 ms 2392 KB Output is correct
22 Correct 6 ms 4188 KB Output is correct
23 Correct 7 ms 5976 KB Output is correct
24 Correct 8 ms 7680 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 549 ms 188200 KB Output is correct
2 Correct 1126 ms 365596 KB Output is correct
3 Runtime error 1461 ms 524288 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 1 ms 856 KB Output is correct
3 Correct 1 ms 860 KB Output is correct
4 Correct 1 ms 1116 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 604 KB Output is correct
7 Correct 1 ms 860 KB Output is correct
8 Correct 1 ms 1116 KB Output is correct
9 Correct 1 ms 604 KB Output is correct
10 Correct 1 ms 860 KB Output is correct
11 Correct 1 ms 860 KB Output is correct
12 Correct 1 ms 968 KB Output is correct
13 Correct 4 ms 2396 KB Output is correct
14 Correct 5 ms 4188 KB Output is correct
15 Correct 6 ms 6236 KB Output is correct
16 Correct 7 ms 7772 KB Output is correct
17 Correct 4 ms 2396 KB Output is correct
18 Correct 5 ms 4104 KB Output is correct
19 Correct 7 ms 5980 KB Output is correct
20 Correct 8 ms 7740 KB Output is correct
21 Correct 4 ms 2392 KB Output is correct
22 Correct 6 ms 4188 KB Output is correct
23 Correct 7 ms 5976 KB Output is correct
24 Correct 8 ms 7680 KB Output is correct
25 Correct 549 ms 188200 KB Output is correct
26 Correct 1126 ms 365596 KB Output is correct
27 Runtime error 1461 ms 524288 KB Execution killed with signal 9
28 Halted 0 ms 0 KB -