# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
235564 | doowey | Klasika (COCI20_klasika) | C++14 | 3488 ms | 457948 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N = (int)2e5 + 100;
const int SZ = (int)6e6 + 100;
int trie[SZ][2];
vector<set<int>> F;
int id;
vector<int> T[N];
int tin[N], tout[N];
ll vl[N];
int tt;
int typ[N];
int ff[N];
int ss[N];
int ads[N];
void dfs(int u){
tin[u] = ++tt;
for(auto x : T[u])
dfs(x);
tout[u]=tt;
}
int main(){
fastIO;
int q;
cin >> q;
int idx = 1;
string tiq;
for(int i = 1; i <= q; i ++ ){
cin >> tiq;
if(tiq == "Add"){
typ[i] = 0;
idx ++ ;
ads[i]=idx;
cin >> ff[i] >> ss[i];
T[ff[i]].push_back(idx);
vl[idx] = (vl[ff[i]] ^ ss[i]);
}
else{
typ[i] = 1;
cin >> ff[i] >> ss[i];
}
}
dfs(1);
ll vv;
int root;
ll ans;
int nn;
int cld;
int it;
int cur, nx;
int mx = 1;
ll a2a;
cur=0;
F.push_back({});
for(int j = 30 ; j >= 0 ; j -- ){
if(trie[cur][0]==0){
F.push_back({});
trie[cur][0] = ++id;
}
cur=trie[cur][0];
F[cur].insert(tin[1]);
}
for(int pp = 1; pp <= q; pp ++ ){
if(typ[pp] == 0){
cur = 0;
mx ++ ;
for(int j = 30 ; j >= 0 ; j -- ){
if((vl[ads[pp]] & (1ll << j))){
nx = 1;
}
else{
nx = 0;
}
if(trie[cur][nx] == 0){
F.push_back({});
trie[cur][nx] = ++id;
}
cur = trie[cur][nx];
F[cur].insert(tin[ads[pp]]);
}
}
else{
vv = vl[ff[pp]];
root = ss[pp];
cur = 0;
ans = 0;
for(int j = 30; j >= 0; j -- ){
if((vv & (1ll << j))){
nx = 1;
}
else{
nx = 0;
}
for(int d = 1; d >= 0 ; d -- ){
nn = (nx ^ d);
if(trie[cur][nn] == 0) continue;
cld = trie[cur][nn];
auto qq = F[cld].lower_bound(tin[root]);
if(qq == F[cld].end() || (*qq) > tout[root]){
continue;
}
else{
if(d) ans |= (1ll << j);
cur = trie[cur][nn];
break;
}
}
}
cout << ans << "\n";
}
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |