#include<bits/stdc++.h>
using namespace std;

#define int long long

#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;

template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

int N,M;
int type[111111];
vint G[111111];
int dep[111111];
int val[111111];

void dfs(int v,int p,int d,int b){
    dep[v]=d;
    val[v]=b;
    for(auto u:G[v]){
        if(u==p)continue;
        int bb=0;
        for(int i=0;i<4;i++){
            int o=i>>(type[u]&1)&1;
            if(type[u]/2==0){
                bb|=((b>>i&1)|o)<<i;
            }
            else if(type[u]/2==1){
                bb|=((b>>i&1)&o)<<i;
            }
            else{
                bb|=((b>>i&1)^o)<<i;
            }
        }
        dfs(u,v,d+1,bb);
    }
}

int dfs2(int v,int p,vint &q){
    if(G[v].size()==(p!=-1)){
        int res=0;
        for(int i=1;i<4;i++){
            res+=(1<<q[i-1])*(val[v]>>i&1);
        }
        return res;
    }

    int res;
    if(dep[v]&1)res=INT_MAX;
    else res=INT_MIN;
    for(auto u:G[v]){
        if(u==p)continue;
        if(dep[v]&1)chmin(res,dfs2(u,v,q));
        else chmax(res,dfs2(u,v,q));
    }
    return res;
}

signed main(){
    cin>>N>>M;
    for(int i=1;i<N;i++){
        string s;
        cin>>s;
        if(s[3]=='|')type[i]=0;
        else if(s[3]=='&')type[i]=1;
        else type[i]=2;
        if(s[4]=='X')type[i]=type[i]*2;
        else type[i]=type[i]*2+1;
    }
    rep(i,N-1){
        int a,b;
        cin>>a>>b;
        G[a].pb(b);G[b].pb(a);
    }


    dfs(0,-1,0,0);
    vector<int>q(3);rep(i,3)q[i]=i;
    map<vint,int>lis;
    do{
        lis[q]=dfs2(0,-1,q);
    }while(next_permutation(all(q)));

    while(M--){
        int x,y;
        cin>>x>>y;
        int xx=(x<<3)+5;
        int yy=(y<<3)+6;

        bool ex[4]={};
        int cur=2;
        for(int i=20;i>=0;i--){
            int o=(xx>>i&1)+(yy>>i&1)*2;
            if(o==0)continue;
            if(ex[o])continue;
            ex[o]=1;
            q[o-1]=cur--;
        }

        int latte=lis[q];
        int ans=0;
        for(int i=15;i>=0;i--){
            ans<<=1;
            int o=(x>>i&1)+(y>>i&1)*2;
            if(o)ans+=latte>>(q[o-1])&1;
        }
        cout<<ans<<endl;
    }
    return 0;
}
### Prompt

Develop a solution in Cpp to the problem described below:

H --Bit Operation Game

Given a rooted tree with N vertices. The vertices are numbered from 0 to N − 1, and the 0th vertex represents the root. `T = 0` for the root, but for the other vertices

* `T = T & X;`
* `T = T & Y;`
* `T = T | X`
* `T = T | Y`
* `T = T ^ X`
* `T = T ^ Y`



One of the operations is written. Here, the operators &, |, ^ mean the bitwise operators and, or, xor, respectively.

Mr. A and Mr. B played the following games M times using this tree. The two start from the root and select the child vertices and proceed alternately, starting from Mr. A and reaching the leaves. The final T value when the operations written in the passed nodes are applied in the order of passing is the score. Mr. B wants to make the score as small as possible, and Mr. A wants to make it large. Given the X and Y values ​​of the M games, output the score for each game when the two make the best choice.

Constraints

* 1 ≤ N ≤ 100000
* 1 ≤ M ≤ 100000
* 0 ≤ X, Y <2 ^ {16}



Input Format

Input is given from standard input in the following format.


N M
o_1_1
o_2
...
o_ {N−1}
u_1 v_1
u_2 v_2
...
u_ {N−1} v_ {N−1}
X_1 Y_1
X_2 Y_2
...
X_M Y_M


On the first line, the number of vertices N of the tree and the integer M representing the number of games played are entered.
From the 2nd line to the Nth line, the operation written at the 1st ... N-1st vertex is input.
In addition, the numbers of the two vertices connected by each side are entered in the N-1 line.
Finally, the values ​​of X and Y in M ​​games are entered over M lines.


Output Format

Print the final T value for each game on the M line.

Sample Input 1


6 3
T = T | X
T = T | Y
T = T | Y
T = T ^ Y
T = T & X;
0 1
0 2
13
14
twenty five
5 6
3 5
0 0


Sample Output 1


Four
6
0


<image>
For X = 5, Y = 6, proceed to vertices 0-> 2-> 5, and T = 5 & 6 = 4.
If X = 3, Y = 5, then go to vertices 0-> 1-> 4, and T = 3 ^ 5 = 6.
If X = 0, Y = 0, T does not change from 0 no matter where you go





Example

Input

6 3
T=T|X
T=T|Y
T=T|Y
T=T^Y
T=T&X
0 1
0 2
1 3
1 4
2 5
5 6
3 5
0 0


Output

4
6
0

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;

#define int long long

#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;

template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

int N,M;
int type[111111];
vint G[111111];
int dep[111111];
int val[111111];

void dfs(int v,int p,int d,int b){
    dep[v]=d;
    val[v]=b;
    for(auto u:G[v]){
        if(u==p)continue;
        int bb=0;
        for(int i=0;i<4;i++){
            int o=i>>(type[u]&1)&1;
            if(type[u]/2==0){
                bb|=((b>>i&1)|o)<<i;
            }
            else if(type[u]/2==1){
                bb|=((b>>i&1)&o)<<i;
            }
            else{
                bb|=((b>>i&1)^o)<<i;
            }
        }
        dfs(u,v,d+1,bb);
    }
}

int dfs2(int v,int p,vint &q){
    if(G[v].size()==(p!=-1)){
        int res=0;
        for(int i=1;i<4;i++){
            res+=(1<<q[i-1])*(val[v]>>i&1);
        }
        return res;
    }

    int res;
    if(dep[v]&1)res=INT_MAX;
    else res=INT_MIN;
    for(auto u:G[v]){
        if(u==p)continue;
        if(dep[v]&1)chmin(res,dfs2(u,v,q));
        else chmax(res,dfs2(u,v,q));
    }
    return res;
}

signed main(){
    cin>>N>>M;
    for(int i=1;i<N;i++){
        string s;
        cin>>s;
        if(s[3]=='|')type[i]=0;
        else if(s[3]=='&')type[i]=1;
        else type[i]=2;
        if(s[4]=='X')type[i]=type[i]*2;
        else type[i]=type[i]*2+1;
    }
    rep(i,N-1){
        int a,b;
        cin>>a>>b;
        G[a].pb(b);G[b].pb(a);
    }


    dfs(0,-1,0,0);
    vector<int>q(3);rep(i,3)q[i]=i;
    map<vint,int>lis;
    do{
        lis[q]=dfs2(0,-1,q);
    }while(next_permutation(all(q)));

    while(M--){
        int x,y;
        cin>>x>>y;
        int xx=(x<<3)+5;
        int yy=(y<<3)+6;

        bool ex[4]={};
        int cur=2;
        for(int i=20;i>=0;i--){
            int o=(xx>>i&1)+(yy>>i&1)*2;
            if(o==0)continue;
            if(ex[o])continue;
            ex[o]=1;
            q[o-1]=cur--;
        }

        int latte=lis[q];
        int ans=0;
        for(int i=15;i>=0;i--){
            ans<<=1;
            int o=(x>>i&1)+(y>>i&1)*2;
            if(o)ans+=latte>>(q[o-1])&1;
        }
        cout<<ans<<endl;
    }
    return 0;
}
```