#include<bits/stdc++.h>
using namespace std;
 
using ll = long long;
ll inf_ll=9e18;
int inf_int=2e9;

//int maxN=262144+5;

int t[262144+5];
void build(char a[],int v,int n){
    if (v*2>n) {
        if (a[v]=='?')
            t[v]=2;
        else
            t[v]=1;
	}
    else{
        build(a,v*2,n);
        build(a,v*2+1,n);
        if (a[v]=='?')
            t[v]=t[v*2]+t[v*2+1];
        else if (a[v]=='0')
            t[v]=t[v*2+1];
        else
            t[v]=t[v*2];
	}
}
int query() {
    return t[1];
}
void update(char a[],int v,int targetV,int depth,int n){
    if (depth==1){
        if (v*2>n){
            if (a[v]=='?')
                t[v]=2;
            else{
                t[v]=1;
			}
		}
        else{
            if (a[v]=='?')
                t[v]=t[v*2]+t[v*2+1];
            else if (a[v]=='0')
                t[v]=t[v*2+1];
            else
                t[v]=t[v*2];
		}
	}
    else{
        
        if ((targetV&(1<<(depth-2)))>0)
            update(a,v*2+1,targetV,depth-1,n);
        else
            update(a,v*2,targetV,depth-1,n);
        
        if (a[v]=='?')
            t[v]=t[v*2]+t[v*2+1];
        else if (a[v]=='0')
            t[v]=t[v*2+1];
        else
            t[v]=t[v*2];
	}
}

int main(){
	//start of fast IO (fast cin and cout). Might not work with interactive problems because cout is paused until all cin has been taken in
	ios_base::sync_with_stdio(false); 
    cin.tie(NULL);  
	string endl="\n";
	//end of fast IO
	
	int k;
	cin>>k;
	string b;
	cin>>b;
	int n=b.size();
	char a[n+1];
	int j=1;
	for (int i=n-1;i>=0;i--) {
		a[j]=b[i];
		j++;
	}
	build(a,1,n);
	
	int q;
	cin>>q;
	while (q--) {
		int idx;
		char c;
		cin>>idx>>c;
		idx=n-idx+1;
		a[idx]=c;
		
		int idxDepth=1;
		int mask=1;
		while (idx>=mask) {
			idxDepth+=1;
			mask*=2;
		}
		idxDepth-=1;
		update(a,1,idx,idxDepth,n);
		cout<<query()<<endl;
	}
	
	return 0;
}
 
/* function <int(int,int)> canExit=[&](int i, int j){ //lambda function template... function <return type(arg1 type, arg2 type)> funcName= ...
}; //semi-colon here
 */ 
 
 // for double cout, be sure to set precision: cout<<setprecision(20)<<double_value;
 
 /* // heapq equivalent
class VecFirstElemComparator { // helps move the element with smallest v[0] to the top of heap
	public:
		bool operator() (vector<int> v1, vector<int> v2) {
			return v1[0] > v2[0];
		}
};
vector<int> v1={10,1,1},v2={8,1,1},v;
priority_queue<vector<int>,vector<vector<int>>,VecFirstElemComparator> pq;
pq.push(v1);
pq.push(v2);

while (!pq.empty()) {
	v=pq.top();
	pq.pop();
	for (int i=0;i<3;i++) cout<<v[i]<<" ";
	cout<<endl;
} */
 
 
 
 
 