#include<bits/stdc++.h>
#define ll long long 
#define int ll
#define pb push_back
#define ff first
#define endl "\n"
#define ss second
#define setbits(x)          __builtin_popcountll(x)
#define lp(x,a,n) for(ll x=a; x<n; x++)
#define lpi(x,a,n) for(int x=a; x<n; x++)
#define w(t) int t; cin>>t; while(t--)
#define vi vector<int> 
#define vll vector<ll>
#define pll pair<ll, ll>
#define pii pair<int, int>
#define inf 1e9
#define LB lower_bound
#define UB upper_bound
const ll mod = 1000000007;
using namespace std;
ll gcd(ll a,ll b){
    if(a==0)return b;
    return gcd(b%a,a);
}
ll lcm(ll a, ll b){
    return (a*b)/gcd(a,b);
}
 
 
// use when we need to find (a/b)%mod value, where a%mod already happened.
// ex we need to find ans/2 and ans already is in the form of ans%mod
// then we can use this statement.
// ans *= find(2, mod-2, mod);
// ans %=  mod;
 
ll divideBymod(ll x, ll y, ll p)
{   ll res = 1; x = x % p;
    while (y > 0)
    {if(y & 1) res = (res*x) % p;
    y = y>>1;x = (x*x) % p;
    }return res;
}
 
int prime[1007];
void SieveOfEratosthenes(int n) 
{ 
    memset(prime, -1, sizeof(prime)); 
  
    for (int p=2; p*p<=n; p++) 
    { 
         
        if (prime[p] == -1) 
        { 
            for (int i=p*p; i<=n; i += p) 
                prime[i] = p; 
        } 
    } 
    
} 


ll power(ll x, ll y) 
{ 
    ll res = 1;     
    while (y > 0) 
    { 
        if (y & 1) 
            res = (res*x)%mod; 
   
        y = y>>1;
        x = (x*x)%mod;  
    } 
    return res; 
}
 

ll fact[3], invfact[3];

void factorial(ll n){
    fact[0] = 1;
    for(ll i=1; i<n; i++){
        fact[i] = (fact[i-1]*i)%mod;
    }
    invfact[n-1] = power(fact[n-1], mod-2ll); //here we are passing mod-2 as power and mod to mod the ans generated
    for(int i=n-2; i>=0; i--){
        invfact[i] = (invfact[i+1]*(i+1))%mod;
    }
}



int LPS(string s, int dp[]){
    int len = 0;
    int n = s.length();
    dp[0] = 0;
    for(int i=1; i<n; i++){
        if(s[i] == s[len]){
            len++;
            dp[i] = len;
            continue;
        }
        if(len!=0){
            len = dp[len-1];
            i--;
            continue;
        }
        dp[i]=0;
    }
    return dp[n-1];
}

bool KMPSearch(string pat, string txt)
{
    int M = pat.length();
    int N = txt.length();
  
    int lps[M];
    LPS(pat, lps);
  
    int i = 0; 
    int j = 0; 
    while (i < N) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }
  
        if (j == M) {
            return true;
            j = lps[j - 1];
        }
        else if (i < N && pat[j] != txt[i]) {
            if (j != 0)
                j = lps[j - 1];
            else
                i = i + 1;
        }
    }
    return false;
}
 

//to calculate p1^x  *  p2^x2  *p3^x3 ----------
//i.e. prime factorization and store pi and xi in vector 
vector<pair<ll, ll>> pFactor;
 
void factorize(long long n) 
{ 
    int count = 0; 
  
    // count the number of times 2 divides  
    while (!(n % 2)) { 
        n >>= 1; // equivalent to n=n/2; 
        count++; 
    } 
  
    // if 2 divides it 
    if (count) 
        pFactor.pb({2,count}); 
  
    // check for all the possible numbers that can  
    // divide it 
    for (long long i = 3; i <= sqrt(n); i += 2) { 
        count = 0; 
        while (n % i == 0) { 
            count++; 
            n = n / i; 
        } 
        if (count) 
            pFactor.pb({i,count});
    } 
  
    // if n at the end is a prime number. 
    if (n > 2) 
        pFactor.pb({n,1}); 
} 
 

 
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    //SieveOfEratosthenes(10000007);
    
        int k;
        cin>>k;
        string s;
        cin>>s;
        int n=s.length();
        int adj[n+1];
        int revadj[n+1][2];
        int j=n;
        int i=n-1;
        while(i>0){
            adj[i] = j;
            revadj[j][1] = i;
            i--;
            
            adj[i] = j;
            revadj[j][0] = i;
            i--;
            j--;
        }
        int val[n+1];
        lp(i,1, n+1){
            if(i<=((1<<k)/2)){
                if(s[i-1]=='?'){
                    val[i] = 2;
                }else {
                    val[i] = 1;
                }
            }else{
                int right = revadj[i][1], left = revadj[i][0];
                right = val[right];
                left = val[left];
                if(s[i-1]=='?'){
                    val[i] = left+right;
                }else if(s[i-1]=='1'){
                    val[i] = right;
                }else val[i]=left;
            }
        }
        int q;
        cin>>q;
        while(q--){
            int p;
            char c;
            cin>>p>>c;
            int updt=0;
            if(p<=((1<<k)/2)){
                if(c=='?'){
                    if(s[p-1]=='?') {
                        goto there;
                    }
                    updt=2;
                }else {
                    if(s[p-1]=='?'){
                        updt=1;
                    }else {
                        goto there;
                    }
                }
            }else {
                int left = revadj[p][0], right= revadj[p][1];
                left = val[left];
                right = val[right];
                
                if(c=='?'){
                    if(s[p-1]=='?'){
                        goto there;
                    }else {
                        updt = left+right;
                    }
                }else {
                    if(c=='0'){
                        updt = left;
                    }else {
                        updt = right;
                    }
                }
            }
            s[p-1] = c;
            val[p] = updt;
            while(p!=n){
                int u = adj[p];
                if(s[u-1]=='1'){
                    if(revadj[u][0]==p){
                        break;
                    }else {
                        val[u] = val[p];
                    }
                }else if(s[u-1]=='0'){
                    if(revadj[u][0]==p){
                        val[u] = val[p];
                    }else break;
                }else {
                    val[u] = val[revadj[u][0]] + val[revadj[u][1]];
                }
                p = u;
            }
            there:
            cout<<val[n]<<endl;
        }
    

}