#include <bits/stdc++.h>
using namespace std;
struct Node {
  bool g0, g1, ge, gn;
  Node() { clear(); }
  Node(bool _g0, bool _g1, bool _ge, bool _gn) {
    g0 = _g0, g1 = _g1, ge = _ge, gn = _gn;
  }
  void clear() { g0 = g1 = ge = gn = false; }
};
char rch() {
  char ch = getchar();
  while (!(ch == '0' || ch == '1' || ch == '?' || ch == '(' || ch == ')' ||
           ch == '|' || ch == '&' || ch == '^'))
    ch = getchar();
  return ch;
}
Node s() {
  char ch = rch();
  if (ch == '0') return Node(1, 0, 0, 0);
  if (ch == '1') return Node(0, 1, 0, 0);
  if (ch == '?') return Node(0, 0, 1, 0);
  Node x, y, ret(0, 0, 0, 0);
  x = s();
  ch = rch();
  y = s();
  rch();
  for (int i = (0); i < (2); ++i) {
    swap(x, y);
    if (ch == '|') {
      ret.g0 |= x.g0 && y.g0;
      ret.g1 |= (x.g1) || (x.ge && y.ge) || (x.ge && y.gn) || (x.gn && y.gn);
      ret.ge |= (x.g0 && y.ge) || (x.ge && y.ge);
      ret.gn |= (x.g0 && y.gn) || (x.gn && y.gn);
    } else if (ch == '&') {
      ret.g0 |= (x.g0) || (x.ge && y.ge) || (x.ge && y.gn) || (x.gn && y.gn);
      ret.g1 |= (x.g1 && y.g1);
      ret.ge |= (x.g1 && y.ge) || (x.ge && y.ge);
      ret.gn |= (x.g1 && y.gn) || (x.gn && y.gn);
    } else if (ch == '^') {
      ret.g0 |= (x.g0 && y.g0) || (x.g1 && y.g1) || (x.ge && y.ge) ||
                (x.gn && y.gn) || (x.ge && y.gn);
      ret.g1 |=
          (x.g0 && y.g1) || (x.ge && y.ge) || (x.ge && y.gn) || (x.gn && y.gn);
      ret.ge |= (x.g0 && y.ge) || (x.g1 && y.gn);
      ret.gn |= (x.g0 && y.gn) || (x.g1 && y.ge);
    }
  }
  return ret;
}
int main() {
  int n;
  scanf("%d", &n);
  Node ans = s();
  if (ans.ge || ans.gn)
    puts("YES");
  else
    puts("NO");
  return 0;
}
