#include<bits/stdc++.h>
using namespace std;
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
namespace io{
  template <typename T> inline void read(T &x) {
    x = 0; T f = 1;char s = getchar();
    for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
    for(;  isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
    x *= f;
  }
  template <typename T> inline void write(T x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x/10);
    putchar(x%10+'0');
  }
};
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (int i = (n); i <  (m); ++i)
#define _rep(n,m,i) for (int i = (n); i <= (m); ++i)
#define _srep(n,m,i)for (int i = (n); i >= (m); i--)
#define _sfor(n,m,i)for (int i = (n); i >  (m); i--)
#define ef(u, i) for(int i = head[u]; i; i = e[i].next)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define ALL(X) (X).begin(), (X).end()
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define GET_POS(c,x) (lower_bound(c.begin(),c.end(),x)-c.begin())
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define fi first
#define se second
#define dbg(x...) do { cout << "|" << #x <<" -> "; err(x); } while (0)
void err() { cout << "|" << endl; }
template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(LL &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<class T> void _W(const T &x) { cout << x; }
void _W(const int &x) { printf("%d", x); }
void _W(const LL &x) { printf("%lld", x); }
void _W(const double &x) { printf("%.16f", x); }
void _W(const char &x) { putchar(x); }
void _W(const char *x) { printf("%s", x); }
template<class T> void _W(const vector<T> &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); }
void W() {}
template<class T, class... U> void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); }
const int N = (1<<19) + 5 ;
char s[N];
int T[N], cnt, fa[N];
int l[N], r[N];
void solve() {
  int n; R(n);
  scanf("%s", s + 1);
  int la = 1<<(n-1);
  int f = la + 1;
  for(int i = 1; i < (1<<n); i += 2) {
    fa[i] = fa[i+1] = f;
    l[f] = i, r[f] = i + 1;
    if(i <= la) {
      if(s[i] == '?') T[i] = 2;
      else T[i] = 1;

      if(s[i+1] == '?') T[i+1] = 2;
      else T[i+1] = 1;
    } else {
      if(s[i] == '?') T[i] = T[l[i]] + T[r[i]];
      else if(s[i] == '0') T[i] = T[l[i]];
      else T[i] = T[r[i]];

      if(s[i+1] == '?') T[i+1] = T[l[i+1]] + T[r[i+1]];
      else if(s[i+1] == '0') T[i+1] = T[l[i+1]];
      else T[i+1] = T[r[i+1]];
    }
    ++f;
  }
  int gen = (1<<n)-1;
  fa[gen] = 0;
  int q; R(q);
  int op;
  char cc[2];
  while(q--) {
    R(op, cc);
    s[op] = cc[0];
    while(op) {
      if(l[op]) {
        if(s[op] == '?') T[op] = T[l[op]] + T[r[op]];
        else if(s[op] == '0') T[op] = T[l[op]];
        else T[op] = T[r[op]];
      } else {
        if(s[op] == '?') T[op] = 2;
        else T[op] = 1;
      }
      op = fa[op];
    }
    W(T[gen]);
  }
}
int main() {
//   #define LOCAL
  #ifdef LOCAL
  freopen("test.in", "r", stdin);
  freopen("test.out", "w", stdout);
  #endif
  // CASET
  solve();
  return 0;
}