#include <bits/stdc++.h>
using namespace std;
const long double PI = acos(-1);
const long double eps = 0.0000000001;
const long long INF = 0x3fffffffffffffff;
long long n;
enum FUCKCCF { Num, And, Xor, Or, Not };
struct node {
  FUCKCCF type;
  bool Val, ans;
  vector<long long> son;
  long long fa;
} a[1000005];
string s;
long long root;
void init(long long now) {
  switch (a[now].type) {
    case And:
      init(a[now].son[0]);
      init(a[now].son[1]);
      a[now].Val = a[a[now].son[0]].Val & a[a[now].son[1]].Val;
      break;
    case Xor:
      init(a[now].son[0]);
      init(a[now].son[1]);
      a[now].Val = a[a[now].son[0]].Val ^ a[a[now].son[1]].Val;
      break;
    case Or:
      init(a[now].son[0]);
      init(a[now].son[1]);
      a[now].Val = a[a[now].son[0]].Val | a[a[now].son[1]].Val;
      break;
    case Not:
      init(a[now].son[0]);
      a[now].Val = !a[a[now].son[0]].Val;
      break;
    case Num:
      break;
  }
}
void dfs(long long now) {
  switch (a[now].type) {
    case And:
      if (a[now].Val != (!a[a[now].son[0]].Val & a[a[now].son[1]].Val)) {
        dfs(a[now].son[0]);
      }
      if (a[now].Val != (a[a[now].son[0]].Val & !a[a[now].son[1]].Val)) {
        dfs(a[now].son[1]);
      }
      break;
    case Xor:
      if (a[now].Val != (!a[a[now].son[0]].Val ^ a[a[now].son[1]].Val)) {
        dfs(a[now].son[0]);
      }
      if (a[now].Val != (a[a[now].son[0]].Val ^ !a[a[now].son[1]].Val)) {
        dfs(a[now].son[1]);
      }
      break;
    case Or:
      if (a[now].Val != (!a[a[now].son[0]].Val | a[a[now].son[1]].Val)) {
        dfs(a[now].son[0]);
      }
      if (a[now].Val != (a[a[now].son[0]].Val | !a[a[now].son[1]].Val)) {
        dfs(a[now].son[1]);
      }
      break;
    case Not:
      dfs(a[now].son[0]);
      break;
    case Num:
      a[now].ans = true;
      break;
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (long long i = 1; i <= n; ++i) {
    cin >> s;
    if (s == "IN") {
      a[i].type = Num;
      cin >> a[i].Val;
    }
    if (s == "AND") {
      a[i].type = And;
      a[i].son.assign(2, 0);
      cin >> a[i].son[0] >> a[i].son[1];
      a[a[i].son[0]].fa = i;
      a[a[i].son[1]].fa = i;
    }
    if (s == "OR") {
      a[i].type = Or;
      a[i].son.assign(2, 0);
      cin >> a[i].son[0] >> a[i].son[1];
      a[a[i].son[0]].fa = i;
      a[a[i].son[1]].fa = i;
    }
    if (s == "NOT") {
      a[i].type = Not;
      a[i].son.assign(1, 0);
      cin >> a[i].son[0];
      a[a[i].son[0]].fa = i;
    }
    if (s == "XOR") {
      a[i].type = Xor;
      a[i].son.assign(2, 0);
      cin >> a[i].son[0] >> a[i].son[1];
      a[a[i].son[0]].fa = i;
      a[a[i].son[1]].fa = i;
    }
  }
  init(1);
  dfs(1);
  for (long long i = 1; i <= n; ++i) {
    if (a[i].type == Num) {
      cout << (a[i].ans ^ a[1].Val);
    }
  }
  cout << endl;
  return 0;
}
