#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
int N,Q,R, key;
const int MAXN = 3e5+5;
struct Node{
int child[2];
Node(){child[0]=child[1]=-1;}
};
Node trie[MAXN*32+1];//all values are <=2^31-1, and we need an additional root node
vector<int> g[MAXN];
int trieRoot[MAXN];
int val[MAXN];
int parent[MAXN];
int reverseMap[MAXN];
int trieptr = 0;
int add(int node, int value){
//cout<<"ADDING "<<value<<endl;
trie[++trieptr] = trie[node];//copy root
int cur = trieptr;
int newRoot = cur;
for(int p = 30; p>=0; --p){//all values are <=2^31-1
int bit = (value >> p) &1;
++trieptr;
if(trie[cur].child[bit]>=0){
trie[trieptr] = trie[trie[cur].child[bit]]; //copy child
}
trie[cur].child[bit] = trieptr;
cur = trieptr;
}
return newRoot;
}
int search(int node, int value){
int cur = node;
int ans = 0;
for(int p = 30; p>=0; --p){//all values are <=2^31-1
int bit = (value >> p) &1;
if(trie[cur].child[bit]>=0){
cur = trie[cur].child[bit];
ans |= bit<<p;
}else{
cur = trie[cur].child[!bit];
ans |= (!bit)<<p;
}
}
return ans;
}
int get_id(int x){
static unordered_map<int,int> mp;
if(!mp.count(x)){
mp[x]=mp.size();
}
int id = mp[x];
reverseMap[id] = x;
return id;
}
void dfs(int u, int p = -1){
parent[u]=p;
if(p!=-1){
trieRoot[u] = add(trieRoot[p], val[u]);
}
for(int v: g[u]){
if(v == p) continue;
dfs(v,u);
}
}
void print(int node, int cur = 0, int depth = 0){
if(trie[node].child[0]>=0){
print(trie[node].child[0],(cur<<1) | 0, depth+1);
}
if(trie[node].child[1]>=0){
print(trie[node].child[1],(cur<<1) | 1, depth +1);
}
if(trie[node].child[0] < 0 && trie[node].child[1] < 0){
cout<<"IN SET: "<<cur<<" "<<depth<<endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> Q;
cin >> R >> key;
R = get_id(R);
val[R] = key;
for (int i = 0; i < N - 1; i++)
{
int u,v,k;
cin >> u >> v >> k;
u = get_id(u);
v = get_id(v);
g[u].push_back(v);
g[v].push_back(u);
val[u]=k;
}
trieRoot[R] = add(0,key);
dfs(R);
int last_answer = 0;
int cntNodes = N;
for (int i = 0; i < Q; i++)
{
int t;
cin >> t;
// find real value of t
t ^= last_answer;
if (t == 0)
{
int v,u,k;
cin >> v >> u >> k;
// find real values for u, v, and k
u ^= last_answer;
v ^= last_answer;
k ^= last_answer;
//cout<<"Q: "<<t<<" "<<v<<" "<<u<<" "<<k<<endl;
u = get_id(u);
v = get_id(v);
trieRoot[u] = add(trieRoot[v],k);
++cntNodes;
}
else
{
int v,k;
cin >> v >> k;
// find real values for v, and k
v ^= last_answer;
k ^= last_answer;
//cout<<"Q: "<<t<<" "<<v<<" "<<k<<endl;
v = get_id(v);
// compute the requested values
int min_answer = k^search(trieRoot[v],k);//
int max_answer = k^search(trieRoot[v],~k);//
cout<<min_answer<<" "<<max_answer<<endl;
// update last_answer
last_answer = min_answer ^ max_answer;
}
}/*
for(int i = 0;i<cntNodes;++i){
cout<<reverseMap[i]<<" "<<(parent[i]>=0?reverseMap[parent[i]] : -1)<<endl;
print(trieRoot[i]);
}*/
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZW5kbCAnXG4nCgppbnQgTixRLFIsIGtleTsKY29uc3QgaW50IE1BWE4gPSAzZTUrNTsKc3RydWN0IE5vZGV7CglpbnQgY2hpbGRbMl07CglOb2RlKCl7Y2hpbGRbMF09Y2hpbGRbMV09LTE7fQp9OwpOb2RlIHRyaWVbTUFYTiozMisxXTsvL2FsbCB2YWx1ZXMgYXJlIDw9Ml4zMS0xLCBhbmQgd2UgbmVlZCBhbiBhZGRpdGlvbmFsIHJvb3Qgbm9kZQp2ZWN0b3I8aW50PiBnW01BWE5dOwppbnQgdHJpZVJvb3RbTUFYTl07CmludCB2YWxbTUFYTl07CmludCBwYXJlbnRbTUFYTl07CmludCByZXZlcnNlTWFwW01BWE5dOwppbnQgdHJpZXB0ciA9IDA7CmludCBhZGQoaW50IG5vZGUsIGludCB2YWx1ZSl7CgkvL2NvdXQ8PCJBRERJTkcgIjw8dmFsdWU8PGVuZGw7Cgl0cmllWysrdHJpZXB0cl0gPSB0cmllW25vZGVdOy8vY29weSByb290CglpbnQgY3VyID0gdHJpZXB0cjsKCWludCBuZXdSb290ID0gY3VyOwoJZm9yKGludCBwID0gMzA7IHA+PTA7IC0tcCl7Ly9hbGwgdmFsdWVzIGFyZSA8PTJeMzEtMQoJCWludCBiaXQgPSAodmFsdWUgPj4gcCkgJjE7CgkJKyt0cmllcHRyOwoJCWlmKHRyaWVbY3VyXS5jaGlsZFtiaXRdPj0wKXsKCQkJdHJpZVt0cmllcHRyXSA9IHRyaWVbdHJpZVtjdXJdLmNoaWxkW2JpdF1dOyAvL2NvcHkgY2hpbGQKCQl9CgkJdHJpZVtjdXJdLmNoaWxkW2JpdF0gPSB0cmllcHRyOwoJCWN1ciA9IHRyaWVwdHI7Cgl9CglyZXR1cm4gbmV3Um9vdDsKfQppbnQgc2VhcmNoKGludCBub2RlLCBpbnQgdmFsdWUpewoJaW50IGN1ciA9IG5vZGU7CglpbnQgYW5zID0gMDsKCWZvcihpbnQgcCA9IDMwOyBwPj0wOyAtLXApey8vYWxsIHZhbHVlcyBhcmUgPD0yXjMxLTEKCQlpbnQgYml0ID0gKHZhbHVlID4+IHApICYxOwoJCWlmKHRyaWVbY3VyXS5jaGlsZFtiaXRdPj0wKXsKCQkJY3VyID0gdHJpZVtjdXJdLmNoaWxkW2JpdF07CgkJCWFucyB8PSBiaXQ8PHA7CgkJfWVsc2V7CgkJCWN1ciA9IHRyaWVbY3VyXS5jaGlsZFshYml0XTsKCQkJYW5zIHw9ICghYml0KTw8cDsKCQl9Cgl9CglyZXR1cm4gYW5zOwp9CgppbnQgZ2V0X2lkKGludCB4KXsKCXN0YXRpYyB1bm9yZGVyZWRfbWFwPGludCxpbnQ+IG1wOwoJaWYoIW1wLmNvdW50KHgpKXsKCQltcFt4XT1tcC5zaXplKCk7Cgl9CglpbnQgaWQgPSBtcFt4XTsKCXJldmVyc2VNYXBbaWRdID0geDsKCXJldHVybiBpZDsKfQoKdm9pZCBkZnMoaW50IHUsIGludCBwID0gLTEpewoJcGFyZW50W3VdPXA7CglpZihwIT0tMSl7CgkJdHJpZVJvb3RbdV0gPSBhZGQodHJpZVJvb3RbcF0sIHZhbFt1XSk7Cgl9Cglmb3IoaW50IHY6IGdbdV0pewoJCWlmKHYgPT0gcCkgY29udGludWU7CgkJZGZzKHYsdSk7Cgl9Cn0KCnZvaWQgcHJpbnQoaW50IG5vZGUsIGludCBjdXIgPSAwLCBpbnQgZGVwdGggPSAwKXsKCWlmKHRyaWVbbm9kZV0uY2hpbGRbMF0+PTApewoJCXByaW50KHRyaWVbbm9kZV0uY2hpbGRbMF0sKGN1cjw8MSkgfCAwLCBkZXB0aCsxKTsKCX0KCWlmKHRyaWVbbm9kZV0uY2hpbGRbMV0+PTApewoJCXByaW50KHRyaWVbbm9kZV0uY2hpbGRbMV0sKGN1cjw8MSkgfCAxLCBkZXB0aCArMSk7Cgl9CglpZih0cmllW25vZGVdLmNoaWxkWzBdIDwgMCAmJiB0cmllW25vZGVdLmNoaWxkWzFdIDwgMCl7CgkJY291dDw8IklOIFNFVDogIjw8Y3VyPDwiICI8PGRlcHRoPDxlbmRsOwoJfQp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCWNpbi50aWUoMCk7CgkKCWNpbiA+PiBOID4+IFE7CgljaW4gPj4gUiA+PiBrZXk7CglSID0gZ2V0X2lkKFIpOwoJdmFsW1JdID0ga2V5OwoJCglmb3IgKGludCBpID0gMDsgaSA8IE4gLSAxOyBpKyspCgl7CgkJaW50IHUsdixrOwoJICAgIGNpbiA+PiB1ID4+IHYgPj4gazsKCSAgICB1ID0gZ2V0X2lkKHUpOwoJICAgIHYgPSBnZXRfaWQodik7CgkgICAgZ1t1XS5wdXNoX2JhY2sodik7CgkgICAgZ1t2XS5wdXNoX2JhY2sodSk7CgkgICAgdmFsW3VdPWs7Cgl9Cgl0cmllUm9vdFtSXSA9IGFkZCgwLGtleSk7CglkZnMoUik7CgkKCWludCBsYXN0X2Fuc3dlciA9IDA7CgkKCWludCBjbnROb2RlcyA9IE47Cglmb3IgKGludCBpID0gMDsgaSA8IFE7IGkrKykKCXsKCQlpbnQgdDsKCSAgICBjaW4gPj4gdDsKCSAgICAKCSAgICAvLyBmaW5kIHJlYWwgdmFsdWUgb2YgdAoJICAgIHQgXj0gbGFzdF9hbnN3ZXI7CgkKCSAgICBpZiAodCA9PSAwKQoJICAgIHsKCSAgICAJaW50IHYsdSxrOwoJICAgICAgICBjaW4gPj4gdiA+PiB1ID4+IGs7CgkgICAgICAgIAoJICAgICAgICAvLyBmaW5kIHJlYWwgdmFsdWVzIGZvciB1LCB2LCBhbmQgawoJICAgICAgICB1IF49IGxhc3RfYW5zd2VyOwoJICAgICAgICB2IF49IGxhc3RfYW5zd2VyOwoJICAgICAgICBrIF49IGxhc3RfYW5zd2VyOwoJICAgICAgICAvL2NvdXQ8PCJROiAiPDx0PDwiICI8PHY8PCIgIjw8dTw8IiAiPDxrPDxlbmRsOwoJICAgICAgICB1ID0gZ2V0X2lkKHUpOwoJICAgICAgICB2ID0gZ2V0X2lkKHYpOwoJICAgICAgICB0cmllUm9vdFt1XSA9IGFkZCh0cmllUm9vdFt2XSxrKTsKCSAgICAgICAgKytjbnROb2RlczsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCSAgICAJaW50IHYsazsKCSAgICAgICAgY2luID4+IHYgPj4gazsKCQoJICAgICAgICAvLyBmaW5kIHJlYWwgdmFsdWVzIGZvciB2LCBhbmQgawoJICAgICAgICB2IF49IGxhc3RfYW5zd2VyOwoJICAgICAgICBrIF49IGxhc3RfYW5zd2VyOwoJICAgICAgICAKCSAgICAgICAgLy9jb3V0PDwiUTogIjw8dDw8IiAiPDx2PDwiICI8PGs8PGVuZGw7CgkgICAgICAgIAoJICAgICAgICB2ID0gZ2V0X2lkKHYpOwoJICAgICAgICAKCSAgICAgICAgLy8gY29tcHV0ZSB0aGUgcmVxdWVzdGVkIHZhbHVlcwoJICAgICAgICAKCSAgICAgICAgaW50IG1pbl9hbnN3ZXIgPSBrXnNlYXJjaCh0cmllUm9vdFt2XSxrKTsvLwoJICAgICAgICBpbnQgbWF4X2Fuc3dlciA9IGtec2VhcmNoKHRyaWVSb290W3ZdLH5rKTsvLwoJICAgICAgICAKCSAgICAgICAgY291dDw8bWluX2Fuc3dlcjw8IiAiPDxtYXhfYW5zd2VyPDxlbmRsOwoJCgkgICAgICAgIC8vIHVwZGF0ZSBsYXN0X2Fuc3dlcgoJICAgICAgICBsYXN0X2Fuc3dlciA9IG1pbl9hbnN3ZXIgXiBtYXhfYW5zd2VyOyAgCgkgICAgfQoJfS8qCglmb3IoaW50IGkgPSAwO2k8Y250Tm9kZXM7KytpKXsKCQljb3V0PDxyZXZlcnNlTWFwW2ldPDwiICI8PChwYXJlbnRbaV0+PTA/cmV2ZXJzZU1hcFtwYXJlbnRbaV1dIDogLTEpPDxlbmRsOwoJCXByaW50KHRyaWVSb290W2ldKTsKCX0qLwoJcmV0dXJuIDA7Cn0=