#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;
}
