#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define pb push_back
#define ss second
#define ff first
#define all(x) (x).begin(), (x).end()
const int nax = 2e5 + 4;
int q, n = 1, k = 1;
int d[nax], eul[nax], eulend[nax];
int cureul = -1;
vector<pii> adj[nax];
struct node
{
char layer = 0;
node *zer, *one;
node(): layer(0), zer(nullptr), one(nullptr){}
node (char d, node *ll, node *rr)
{
zer = ll, one = rr;
layer= d;
}
node(node *cp): layer(cp->layer), zer(cp->zer), one(cp->one) {}
};
node *update(node *Node, int val, char d)
{
if(d == 0)
return new node();
if(val & (1 << (d - 1)))
{
if(Node->one == nullptr)
Node->one = new node(d - 1, nullptr, nullptr);
return new node(d, Node->zer, update(Node->one, val, d - 1));
}
else
{
if(Node->zer == nullptr)
Node->zer = new node(d - 1, nullptr, nullptr);
return new node(d, update(Node->zer, val, d - 1), Node->one);
}
}
node *roots[4 * nax];
int query(node *Node, int val)
{
if(Node->layer == 0)
return 0;
// cout << Node->layer << ' ' << val << '\n';
if(val & (1 << (Node->layer - 1)))
{
if(Node->zer != nullptr)
return (1 << (Node->layer - 1)) + query(Node->zer, val);
else
return query(Node->one, val);
}
else
{
if(Node->one != nullptr)
return (1 << (Node->layer - 1)) + query(Node->one, val);
else
return query(Node->zer, val);
}
}
void pupd(int i, int val)
{
i += k;
if(roots[i] == nullptr)
roots[i] = new node(30, nullptr, nullptr);
roots[i] = update(roots[i], val, 30);
// cout << i << endl;
i /= 2;
while(i)
{
//cout << i << endl;
if(roots[i] == nullptr)
roots[i] = new node(30, nullptr, nullptr);
roots[i] = update(roots[i], val, 30);
i /= 2;
}
}
int squery(int p, int l, int r, int i, int j, int val)
{
if(i > j)
return 0;
if(l >= i && r <= j)
{
if(roots[p] != nullptr)
return query(roots[p], val);
else
return 0;
}
int m = (l + r)/2;
return max(squery(2 * p, l, m, i, min(j, m), val),
squery(2 * p + 1, m + 1, r, max(i, m + 1), j, val));
}
void dfs(int x, int p)
{
eul[x] = ++cureul;
for(auto e: adj[x])
{
d[e.ff] = d[x]^e.ss;
dfs(e.ff, x);
}
eulend[x] = cureul;
}
void solve()
{
cin >> q;
vector<pair<int,pii>> queries;
bool flag= true;
for(int i = 1; i <= q; i++)
{
string s; cin >> s;
int x, y;
cin >> x >> y;
if(s== "Add")
{
adj[x].pb({++n, y});
x = n;
}
else
{
flag &= (y == 1);
}
queries.pb({(s == "Query"), {x, y}});
}
dfs(1, 0);
while(k < n)
k = (k << 1);
//bbuild(1, 0, k - 1);
pupd(0, 0);
// cout << squery(1, 0, k - 1, eul[1], eulend[1], d[1]) << '\n';
for(auto e: queries)
{
if(flag)
{
if(e.ff == 0)
{
//cout << e.ss.ff << ' ' << eul[e.ss.ff] << endl;
update(roots[1], d[e.ss.ff], 30);
}
else
{
int a = e.ss.ff;
int b = e.ss.ss;
// cout << a << ' ' << b << endl;
cout << query(roots[1], d[a]) << '\n';
}
}
else
{
if(e.ff == 0)
{
//cout << e.ss.ff << ' ' << eul[e.ss.ff] << endl;
pupd(eul[e.ss.ff], d[e.ss.ff]);
}
else
{
int a = e.ss.ff;
int b = e.ss.ss;
// cout << a << ' ' << b << endl;
cout << squery(1, 0, k - 1, eul[b], eulend[b], d[a]) << '\n';
}
}
}
}
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int tt = 1;
while(tt--)
solve();
}
Compilation message
klasika.cpp: In function 'void solve()':
klasika.cpp:159:21: warning: unused variable 'b' [-Wunused-variable]
159 | int b = e.ss.ss;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5716 KB |
Output is correct |
2 |
Correct |
4 ms |
6100 KB |
Output is correct |
3 |
Correct |
4 ms |
6740 KB |
Output is correct |
4 |
Correct |
5 ms |
7508 KB |
Output is correct |
5 |
Correct |
3 ms |
5460 KB |
Output is correct |
6 |
Correct |
3 ms |
6100 KB |
Output is correct |
7 |
Correct |
4 ms |
6596 KB |
Output is correct |
8 |
Correct |
5 ms |
7636 KB |
Output is correct |
9 |
Correct |
3 ms |
5588 KB |
Output is correct |
10 |
Correct |
4 ms |
6308 KB |
Output is correct |
11 |
Correct |
4 ms |
6868 KB |
Output is correct |
12 |
Correct |
5 ms |
7636 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5716 KB |
Output is correct |
2 |
Correct |
4 ms |
6100 KB |
Output is correct |
3 |
Correct |
4 ms |
6740 KB |
Output is correct |
4 |
Correct |
5 ms |
7508 KB |
Output is correct |
5 |
Correct |
3 ms |
5460 KB |
Output is correct |
6 |
Correct |
3 ms |
6100 KB |
Output is correct |
7 |
Correct |
4 ms |
6596 KB |
Output is correct |
8 |
Correct |
5 ms |
7636 KB |
Output is correct |
9 |
Correct |
3 ms |
5588 KB |
Output is correct |
10 |
Correct |
4 ms |
6308 KB |
Output is correct |
11 |
Correct |
4 ms |
6868 KB |
Output is correct |
12 |
Correct |
5 ms |
7636 KB |
Output is correct |
13 |
Correct |
12 ms |
12628 KB |
Output is correct |
14 |
Correct |
21 ms |
21292 KB |
Output is correct |
15 |
Correct |
30 ms |
31512 KB |
Output is correct |
16 |
Correct |
36 ms |
39380 KB |
Output is correct |
17 |
Correct |
11 ms |
12208 KB |
Output is correct |
18 |
Correct |
20 ms |
20820 KB |
Output is correct |
19 |
Correct |
31 ms |
31052 KB |
Output is correct |
20 |
Correct |
36 ms |
39024 KB |
Output is correct |
21 |
Correct |
12 ms |
12328 KB |
Output is correct |
22 |
Correct |
20 ms |
20924 KB |
Output is correct |
23 |
Correct |
37 ms |
30996 KB |
Output is correct |
24 |
Correct |
38 ms |
38960 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
187 ms |
70376 KB |
Output is correct |
2 |
Correct |
253 ms |
129140 KB |
Output is correct |
3 |
Correct |
300 ms |
185972 KB |
Output is correct |
4 |
Correct |
351 ms |
243320 KB |
Output is correct |
5 |
Correct |
185 ms |
68948 KB |
Output is correct |
6 |
Correct |
247 ms |
126292 KB |
Output is correct |
7 |
Correct |
300 ms |
181624 KB |
Output is correct |
8 |
Correct |
356 ms |
237308 KB |
Output is correct |
9 |
Correct |
181 ms |
68700 KB |
Output is correct |
10 |
Correct |
253 ms |
127036 KB |
Output is correct |
11 |
Correct |
294 ms |
183244 KB |
Output is correct |
12 |
Correct |
350 ms |
238920 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
5716 KB |
Output is correct |
2 |
Correct |
4 ms |
6100 KB |
Output is correct |
3 |
Correct |
4 ms |
6740 KB |
Output is correct |
4 |
Correct |
5 ms |
7508 KB |
Output is correct |
5 |
Correct |
3 ms |
5460 KB |
Output is correct |
6 |
Correct |
3 ms |
6100 KB |
Output is correct |
7 |
Correct |
4 ms |
6596 KB |
Output is correct |
8 |
Correct |
5 ms |
7636 KB |
Output is correct |
9 |
Correct |
3 ms |
5588 KB |
Output is correct |
10 |
Correct |
4 ms |
6308 KB |
Output is correct |
11 |
Correct |
4 ms |
6868 KB |
Output is correct |
12 |
Correct |
5 ms |
7636 KB |
Output is correct |
13 |
Correct |
12 ms |
12628 KB |
Output is correct |
14 |
Correct |
21 ms |
21292 KB |
Output is correct |
15 |
Correct |
30 ms |
31512 KB |
Output is correct |
16 |
Correct |
36 ms |
39380 KB |
Output is correct |
17 |
Correct |
11 ms |
12208 KB |
Output is correct |
18 |
Correct |
20 ms |
20820 KB |
Output is correct |
19 |
Correct |
31 ms |
31052 KB |
Output is correct |
20 |
Correct |
36 ms |
39024 KB |
Output is correct |
21 |
Correct |
12 ms |
12328 KB |
Output is correct |
22 |
Correct |
20 ms |
20924 KB |
Output is correct |
23 |
Correct |
37 ms |
30996 KB |
Output is correct |
24 |
Correct |
38 ms |
38960 KB |
Output is correct |
25 |
Correct |
187 ms |
70376 KB |
Output is correct |
26 |
Correct |
253 ms |
129140 KB |
Output is correct |
27 |
Correct |
300 ms |
185972 KB |
Output is correct |
28 |
Correct |
351 ms |
243320 KB |
Output is correct |
29 |
Correct |
185 ms |
68948 KB |
Output is correct |
30 |
Correct |
247 ms |
126292 KB |
Output is correct |
31 |
Correct |
300 ms |
181624 KB |
Output is correct |
32 |
Correct |
356 ms |
237308 KB |
Output is correct |
33 |
Correct |
181 ms |
68700 KB |
Output is correct |
34 |
Correct |
253 ms |
127036 KB |
Output is correct |
35 |
Correct |
294 ms |
183244 KB |
Output is correct |
36 |
Correct |
350 ms |
238920 KB |
Output is correct |
37 |
Runtime error |
908 ms |
524288 KB |
Execution killed with signal 9 |
38 |
Halted |
0 ms |
0 KB |
- |