#include <bits/stdc++.h>   template <class C, class E>   inline bool contains(const C &container, const E &element) {     return container.find(element) != container.end();   }   template <class T>   inline void checkmin(T &a, T b) {     if (b < a) a = b;   }   template <class T>   inline void checkmax(T &a, T b) {     if (b > a) a = b;   }   using namespace std;   map<int, bool> res;   enum Type { XOR, AND, IN, NOT, OR };   struct Gate {     Type _type;     int _index;     bool _bOriVal;     int _c[2];   };   vector<Gate> gates;   bool Eval(int index) {     Gate &g = gates[index];     bool bRes;     switch (g._type) {       case OR: {         bool b1 = Eval(g._c[0]);         bool b2 = Eval(g._c[1]);         bRes = b1 || b2;       } break;       case AND: {         bool b1 = Eval(g._c[0]);         bool b2 = Eval(g._c[1]);         bRes = b1 && b2;       } break;       case NOT:         bRes = !Eval(g._c[0]);         break;       case XOR:         bRes = Eval(g._c[0]) != Eval(g._c[1]);         break;       case IN:         bRes = g._bOriVal;         break;     }     g._bOriVal = bRes;     return bRes;   }   void Solve(int index, bool resObt[2]) {     Gate &g = gates[index];     switch (g._type) {       case OR: {         for (int i = 0; i < 2; ++i) {           int askedSubGate = g._c[i];           int otherSubGate = g._c[1 - i];           bool otherSubVal = gates[otherSubGate]._bOriVal;           bool rr[2];           rr[false] = resObt[otherSubVal || false];           rr[true] = resObt[otherSubVal || true];           Solve(askedSubGate, rr);         }         break;       }       case AND:         for (int i = 0; i < 2; ++i) {           int askedSubGate = g._c[i];           int otherSubGate = g._c[1 - i];           bool otherSubVal = gates[otherSubGate]._bOriVal;           bool rr[2];           rr[false] = resObt[otherSubVal && false];           rr[true] = resObt[otherSubVal && true];           Solve(askedSubGate, rr);         }         break;       case NOT: {         bool rr[2];         rr[0] = resObt[1];         rr[1] = resObt[0];         Solve(g._c[0], rr);         break;       }       case XOR: {         for (int i = 0; i < 2; ++i) {           int askedSubGate = g._c[i];           int otherSubGate = g._c[1 - i];           bool otherSubVal = gates[otherSubGate]._bOriVal;           bool rr[2];           rr[false] = resObt[otherSubVal != false];           rr[true] = resObt[otherSubVal != true];           Solve(askedSubGate, rr);         }         break;       }       case IN: {         res[g._index] = resObt[!g._bOriVal];         break;       }     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     cout << std::setprecision(15);     cout << std::fixed;     int n;     cin >> n;     gates.resize(n + 1);     for (int i = (1), _b = (n); i <= _b; i++) {       string s;       cin >> s;       if (s ==  IN ) {         gates[i]._type = IN;         bool val;         cin >> val;         gates[i]._bOriVal = val;         gates[i]._index = i;       } else if (s ==  AND ) {         gates[i]._type = AND;         cin >> gates[i]._c[0] >> gates[i]._c[1];       } else if (s ==  OR ) {         gates[i]._type = OR;         cin >> gates[i]._c[0] >> gates[i]._c[1];       } else if (s ==  XOR ) {         gates[i]._type = XOR;         cin >> gates[i]._c[0] >> gates[i]._c[1];       } else if (s ==  NOT ) {         gates[i]._type = NOT;         cin >> gates[i]._c[0];       }     }     bool current = Eval(1);     bool rr[2] = {false, true};     Solve(1, rr);     for (auto &v : res) {       cout << (v.second ?  1  :  0 );     }     return 0;   }