#include <bits/stdc++.h>   using namespace std;   const int N = 1000051;   long long n;   string c;   struct btree {     int chnum;     int child[2];     int num;     int typ;     int id;   } tre[N];   int dfx[N][2];   int tot = 0;   int has[N];   void predfs(int x) {     if (tre[x].typ == 0) return;     if (tre[x].typ == 1) {       predfs(tre[x].child[0]);       predfs(tre[x].child[1]);       tre[x].num = tre[tre[x].child[0]].num & tre[tre[x].child[1]].num;     }     if (tre[x].typ == 2) {       predfs(tre[x].child[0]);       predfs(tre[x].child[1]);       tre[x].num = tre[tre[x].child[0]].num | tre[tre[x].child[1]].num;     }     if (tre[x].typ == 3) {       predfs(tre[x].child[0]);       predfs(tre[x].child[1]);       tre[x].num = tre[tre[x].child[0]].num ^ tre[tre[x].child[1]].num;     }     if (tre[x].typ == 4) {       predfs(tre[x].child[0]);       tre[x].num = !tre[tre[x].child[0]].num;     }   }   void dfs(int x) {     if (tre[x].typ == 0) has[tre[x].id] = dfx[tot][tre[x].num ^ 1];     if (tre[x].typ == 1) {       tot++;       dfx[tot][0] = dfx[tot - 1][0 & tre[tre[x].child[1]].num];       dfx[tot][1] = dfx[tot - 1][1 & tre[tre[x].child[1]].num];       dfs(tre[x].child[0]);       dfx[tot][0] = dfx[tot - 1][0 & tre[tre[x].child[0]].num];       dfx[tot][1] = dfx[tot - 1][1 & tre[tre[x].child[0]].num];       dfs(tre[x].child[1]);       tot--;     }     if (tre[x].typ == 2) {       tot++;       dfx[tot][0] = dfx[tot - 1][0 | tre[tre[x].child[1]].num];       dfx[tot][1] = dfx[tot - 1][1 | tre[tre[x].child[1]].num];       dfs(tre[x].child[0]);       dfx[tot][0] = dfx[tot - 1][0 | tre[tre[x].child[0]].num];       dfx[tot][1] = dfx[tot - 1][1 | tre[tre[x].child[0]].num];       dfs(tre[x].child[1]);       tot--;     }     if (tre[x].typ == 3) {       tot++;       dfx[tot][0] = dfx[tot - 1][0 ^ tre[tre[x].child[1]].num];       dfx[tot][1] = dfx[tot - 1][1 ^ tre[tre[x].child[1]].num];       dfs(tre[x].child[0]);       dfx[tot][0] = dfx[tot - 1][0 ^ tre[tre[x].child[0]].num];       dfx[tot][1] = dfx[tot - 1][1 ^ tre[tre[x].child[0]].num];       dfs(tre[x].child[1]);       tot--;     }     if (tre[x].typ == 4) {       tot++;       dfx[tot][0] = dfx[tot - 1][1];       dfx[tot][1] = dfx[tot - 1][0];       dfs(tre[x].child[0]);       tot--;     }   }   void init() {     cin >> n;     for (int i = 1; i <= n; i++) has[i] = -1;     for (int i = 1; i <= n; i++) {       cin >> c;       tre[i].id = i;       if (c ==  IN ) {         tre[i].chnum = 0;         tre[i].typ = 0;         scanf( %d , &tre[i].num);       }       if (c ==  AND ) {         tre[i].chnum = 2;         tre[i].typ = 1;         tre[i].num = -1;         scanf( %d%d , &tre[i].child[0], &tre[i].child[1]);       }       if (c ==  OR ) {         tre[i].chnum = 2;         tre[i].typ = 2;         tre[i].num = -1;         scanf( %d%d , &tre[i].child[0], &tre[i].child[1]);       }       if (c ==  XOR ) {         tre[i].chnum = 2;         tre[i].typ = 3;         tre[i].num = -1;         scanf( %d%d , &tre[i].child[0], &tre[i].child[1]);       }       if (c ==  NOT ) {         tre[i].chnum = 1;         tre[i].typ = 4;         tre[i].num = -1;         scanf( %d , &tre[i].child[0]);       }     }     dfx[0][0] = 0;     dfx[0][1] = 1;     predfs(1);     dfs(1);     for (int i = 1; i <= n; i++)       if (has[i] != -1) printf( %d , has[i]);     printf(  n );   }   int main() {     int T;     T = 1;     while (T--) init();     return 0;   }