#include <bits/stdc++.h>   int dr[] = {2, 2, -2, -2, 1, -1, 1, -1};   int dc[] = {1, -1, 1, -1, 2, 2, -2, -2};   int dr1[] = {0, 0, 1, 1, 1, -1, -1, -1};   int dc1[] = {1, -1, 1, 0, -1, 0, 1, -1};   int dr2[] = {0, 0, 1, -1};   int dc2[] = {1, -1, 0, 0};   using namespace std;   vector<int> adj[1000005];   int a[1000005], b[1000005], dp1[1000005];   long long get(string t) {     if (t ==  IN ) return 0;     if (t ==  AND ) return 1;     if (t ==  XOR ) return 2;     if (t ==  OR ) return 3;     if (t ==  NOT ) return 4;   }   long long get1(long long x, long long y, long long v) {     if (a[v] == 1) return (x & y);     if (a[v] == 2) return (x ^ y);     if (a[v] == 3) return (x | y);   }   long long dfs(long long u) {     if (a[u] == 0) {       dp1[u] = b[u];       return dp1[u];     }     long long i, j;     if (adj[u].size() == 1) {       long long p = adj[u][0];       long long r = dfs(p) ^ 1;       dp1[u] = r;       return r;     } else {       long long p = adj[u][0];       long long q = adj[u][1];       p = dfs(p);       q = dfs(q);       long long r;       if (a[u] == 1)         r = p & q;       else if (a[u] == 2)         r = p ^ q;       else if (a[u] == 3)         r = p | q;       dp1[u] = r;       return r;     }   }   int dp[1000005][2][2];   long long cal(long long x, long long f, long long f1) {     if (f1 == 0) return (dp1[x] == f);     if (a[x] == 0) {       if (b[x] ^ 1 == f) return 1;       return 0;     }     int &r = dp[x][f][f1];     if (r != -1) return r;     r = 0;     if (adj[x].size() == 1) {       long long p = adj[x][0];       r = cal(p, f ^ 1, f1);       return r;     } else {       long long i, j;       long long p = adj[x][0];       long long q = adj[x][1];       for (i = 0; i < 2; i++) {         for (j = 0; j < 2; j++) {           long long p1 = get1(i, j, x);           if (p1 == f) {             long long r1 = cal(p, i, f1) & cal(q, j, 1 - f1);             long long r2 = cal(p, i, 1 - f1) & cal(q, j, f1);             r |= r1;             r |= r2;           }         }       }       return r;     }   }   int mark[1000005];   void print(long long x, long long f, long long f1) {     if (a[x] == 0) {       mark[x] = 1;       return;     }     if (adj[x].size() == 1) {       long long p = adj[x][0];       print(p, f ^ 1, f1);       return;     }     long long i, j;     long long p = adj[x][0];     long long q = adj[x][1];     for (i = 0; i < 2; i++) {       for (j = 0; j < 2; j++) {         long long p1 = get1(i, j, x);         if (p1 == f) {           long long r1 = cal(p, i, f1) & cal(q, j, 1 - f1);           if (r1 == 1) {             print(p, i, f1);           }           r1 = cal(p, i, 1 - f1) & cal(q, j, f1);           if (r1 == 1) {             print(q, j, f1);           }         }       }     }   }   int main() {     int n, i, j, x, y;     while (cin >> n) {       for (i = 1; i <= n; i++) {         string t;         cin >> t;         a[i] = get(t);         if (a[i] == 0 || a[i] == 4) {           cin >> x;           if (a[i] == 0)             b[i] = x;           else             adj[i].push_back(x);         } else {           cin >> x >> y;           adj[i].push_back(x);           adj[i].push_back(y);         }       }       long long ans = dfs(1);       memset(dp, -1, sizeof(dp));       long long p = cal(1, ans ^ 1, 1);       print(1, ans ^ 1, 1);       for (i = 1; i <= n; i++) {         if (a[i] == 0) {           if (mark[i] == 0)             cout << ans;           else             cout << (ans ^ 1);         }       }       cout << endl;     }     return 0;   }