#include <bits/stdc++.h>
const int maxn = 1e6 + 7;
int n;
bool st[maxn], cg[maxn];
char buf[10];
struct node {
  int t, l, r;
  void read() {
    scanf("%s%d", buf, &l);
    switch (buf[0]) {
      case 'I':
        t = 0;
        break;
      case 'N':
        t = 1;
        break;
      case 'A':
        t = 2;
        scanf("%d", &r);
        break;
      case 'O':
        t = 3;
        scanf("%d", &r);
        break;
      case 'X':
        t = 4;
        scanf("%d", &r);
        break;
      default:
        break;
    }
  }
} np[maxn];
void calcSt(int k) {
  switch (np[k].t) {
    case 0:
      break;
    case 1:
      calcSt(np[k].l);
      break;
    case 2:
      calcSt(np[k].l);
      calcSt(np[k].r);
      break;
    case 3:
      calcSt(np[k].l);
      calcSt(np[k].r);
      break;
    case 4:
      calcSt(np[k].l);
      calcSt(np[k].r);
      break;
    default:
      break;
  }
  switch (np[k].t) {
    case 0:
      st[k] = np[k].l;
      break;
    case 1:
      st[k] = !st[np[k].l];
      break;
    case 2:
      st[k] = st[np[k].l] && st[np[k].r];
      break;
    case 3:
      st[k] = st[np[k].l] || st[np[k].r];
      break;
    case 4:
      st[k] = st[np[k].l] ^ st[np[k].r];
      break;
    default:
      break;
  }
}
void checkCg(int k) {
  if (!cg[k]) return;
  switch (np[k].t) {
    case 0:
      break;
    case 1:
      cg[np[k].l] = cg[k];
      checkCg(np[k].l);
      break;
    case 2:
      if (st[k]) {
        cg[np[k].l] = cg[k];
        cg[np[k].r] = cg[k];
        checkCg(np[k].l);
        checkCg(np[k].r);
      } else {
        if (!st[np[k].l] && st[np[k].r]) {
          cg[np[k].l] = cg[k];
          checkCg(np[k].l);
        }
        if (!st[np[k].r] && st[np[k].l]) {
          cg[np[k].r] = cg[k];
          checkCg(np[k].r);
        }
      }
      break;
    case 3:
      if (!st[k]) {
        cg[np[k].l] = cg[k];
        cg[np[k].r] = cg[k];
        checkCg(np[k].l);
        checkCg(np[k].r);
      } else {
        if (st[np[k].l] && !st[np[k].r]) {
          cg[np[k].l] = cg[k];
          checkCg(np[k].l);
        }
        if (st[np[k].r] && !st[np[k].l]) {
          cg[np[k].r] = cg[k];
          checkCg(np[k].r);
        }
      }
      break;
    case 4:
      cg[np[k].l] = cg[k];
      cg[np[k].r] = cg[k];
      checkCg(np[k].l);
      checkCg(np[k].r);
      break;
    default:
      break;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    np[i].read();
  }
  calcSt(1);
  cg[1] = true;
  checkCg(1);
  for (int i = 1; i <= n; ++i)
    if (np[i].t == 0) {
      putchar((cg[i] ^ st[1]) ? '1' : '0');
    }
  putchar('\n');
  return 0;
}
