Problem: 2^k teams participate in a playoff tournament. The tournament consists of 2^k - 1 games. They are held as follows: first of all, the teams are split into pairs: team 1 plays against team 2, team 3 plays against team 4 (exactly in this order), and so on (so, 2^{k-1} games are played in that phase). When a team loses a game, it is eliminated, and each game results in elimination of one team (there are no ties). After that, only 2^{k-1} teams remain. If only one team remains, it is declared the champion; otherwise, 2^{k-2} games are played: in the first one of them, the winner of the game "1 vs 2" plays against the winner of the game "3 vs 4", then the winner of the game "5 vs 6" plays against the winner of the game "7 vs 8", and so on. This process repeats until only one team remains.

For example, this picture describes the chronological order of games with k = 3:

<image>

Let the string s consisting of 2^k - 1 characters describe the results of the games in chronological order as follows:

  * if s_i is 0, then the team with lower index wins the i-th game; 
  * if s_i is 1, then the team with greater index wins the i-th game; 
  * if s_i is ?, then the result of the i-th game is unknown (any team could win this game). 



Let f(s) be the number of possible winners of the tournament described by the string s. A team i is a possible winner of the tournament if it is possible to replace every ? with either 1 or 0 in such a way that team i is the champion.

You are given the initial state of the string s. You have to process q queries of the following form: 

  * p c — replace s_p with character c, and print f(s) as the result of the query. 

Input

The first line contains one integer k (1 ≤ k ≤ 18).

The second line contains a string consisting of 2^k - 1 characters — the initial state of the string s. Each character is either ?, 0, or 1.

The third line contains one integer q (1 ≤ q ≤ 2 ⋅ 10^5) — the number of queries.

Then q lines follow, the i-th line contains an integer p and a character c (1 ≤ p ≤ 2^k - 1; c is either ?, 0, or 1), describing the i-th query.

Output

For each query, print one integer — f(s).

Example

Input


3
0110?11
6
5 1
6 ?
7 ?
1 ?
5 ?
1 1


Output


1
2
3
3
5
4

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;

import static java.util.Collections.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Solution {
    static final int SCAN_LINE_LENGTH = 1_000_002;
    private static final boolean thread = false;
    @SuppressWarnings("all")
    static final boolean HAS_TEST_CASES = (1 == 0) ? true : false;

    static int n, a[], e[][], vis[], m, b[];
    @SuppressWarnings("all")
    private static ArrayList<Integer> adj[], v = new ArrayList<>();
    static long gcd = 1;
    static HashMap<Integer, Integer> pos;

    @SuppressWarnings("unchecked")
    static void solve() throws Exception {
        int n = ni();
        char c[] = ns();
        int[][] hash = new int[n][1 << (n - 1)];
        char[][] hashc = new char[n][1 << (n - 1)];
        int k = 0;
        for (int i = hash.length - 1; i > -1; --i) {
            for (int j = 0; j < (1 << i); j++) {
                hashc[i][j] = c[k];
                hash[i][j] = get(hash, c[k++], i, j);
            }
        }
        int q = ni();
        while (q-- > 0) {
            int p = ni(), i = hash.length - 1, pp = p;
            char ch = ns()[0];
            while (p > (1 << i)) {
                p -= (1 << i);
                i--;
            }
            hashc[i][--p] = ch;
            for (int j = p; i > -1; --i, j /= 2) {
                hash[i][j] = get(hash, hashc[i][j], i, j);
            }
            pn(hash[0][0]);
        }

    }

    private static int get(int[][] hash, char c, int i, int j) {
        if (i == hash.length - 1) {
            if (c == '?')
                return 2;
            else if (c == '1')
                return 1;
            else
                return 1;
        }
        if (c == '?')
            return hash[i + 1][2 * j] + hash[i + 1][2 * j + 1];
        else if (c == '1')
            return hash[i + 1][2 * j + 1];
        return hash[i + 1][2 * j];
    }

    public static void main(final String[] args) throws Exception {
        if (!thread) {
            final int testcases = HAS_TEST_CASES ? ni() : 1;
            for (int i = 1; i <= testcases; i++) {
                // pni(i + " t");
                // out.print("Case #" + (i) + ": ");
                try {
                    solve();
                } catch (final Exception e) {
                    // pni("idk Exception");
                    // e.printStackTrace(System.err);
                    // System.exit(0);
                    throw e;
                }
            }
            out.flush();
        }
        r.close();
        out.close();
    }

    @SuppressWarnings("all")
    private static final int MOD = (int) (1e9 + 7), MOD_FFT = 998244353;
    private static final Reader r = new Reader();
    private static final PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

    public static long[] enumPows(int a, int n, int mod) {
        a %= mod;
        long[] pows = new long[n + 1];
        pows[0] = 1;
        for (int i = 1; i <= n; i++)
            pows[i] = pows[i - 1] * a % mod;
        return pows;
    }

    @SuppressWarnings("all")
    private static boolean eq(long a, long b) {
        return Long.compare(a, b) == 0;
    }

    @SuppressWarnings("all")
    private static ArrayList<Integer> seive(int n) {
        ArrayList<Integer> p = new ArrayList<>();
        int[] f = new int[n + 1];
        for (int i = 2; i <= n; i++) {
            if (f[i] == 1)
                continue;
            for (int j = i * i; j <= n && j < f.length; j += i) {
                f[j] = 1;
            }
        }
        for (int i = 2; i < f.length; i++) {
            if (f[i] == 0)
                p.add(i);
        }
        return p;
    }

    @SuppressWarnings("all")
    private static void s(int[] a) {
        Integer[] t = new Integer[a.length];
        for (int i = 0; i < t.length; i++) {
            t[i] = a[i];
        }
        sort(t);
        for (int i = 0; i < t.length; i++) {
            a[i] = t[i];
        }
    }

    int pow(int a, int b, int m) {
        int ans = 1;
        while (b != 0) {
            if ((b & 1) != 0)
                ans = (ans * a) % m;
            b /= 2;
            a = (a * a) % m;
        }
        return ans;
    }

    int modinv(int k) {
        return pow(k, MOD - 2, MOD);
    }

    @SuppressWarnings("all")
    private static void swap(final int i, final int j) {
        final int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    @SuppressWarnings("all")
    private static boolean isMulOverflow(final long A, final long B) {
        if (A == 0 || B == 0)
            return false;
        final long result = A * B;
        if (A == result / B)
            return true;
        return false;
    }

    @SuppressWarnings("all")
    private static int gcd(final int a, final int b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }

    @SuppressWarnings("all")
    private static long gcd(final long a, final long b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }

    @SuppressWarnings("all")
    private static class Pair<T, E> implements Comparable<Pair<T, E>> {
        T fir;
        E snd;

        Pair() {
        }

        Pair(final T x, final E y) {
            this.fir = x;
            this.snd = y;
        }

        // @Override
        // @SuppressWarnings("unchecked")
        // public int compareTo(final Pair<T, E> o) {
        // final int c = ((Comparable<T>) fir).compareTo(o.fir);
        // return c != 0 ? c : ((Comparable<E>) snd).compareTo(o.snd);
        // }
        @Override
        @SuppressWarnings("unchecked")
        public int compareTo(final Pair<T, E> o) {
            final int c = ((Comparable<T>) fir).compareTo(o.fir);
            return c;
        }

    }

    @SuppressWarnings("all")
    private static class pi implements Comparable<pi> {
        int fir, snd;

        pi() {
        }

        pi(final int a, final int b) {
            fir = a;
            snd = b;
        }

        public int compareTo(final pi o) {
            return fir == o.fir ? snd - o.snd : fir - o.fir;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + fir;
            result = prime * result + snd;
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            pi other = (pi) obj;
            if (fir != other.fir)
                return false;
            if (snd != other.snd)
                return false;
            return true;
        }

    }

    @SuppressWarnings("all")
    private static <T> void checkV(final Vector<T> adj[], final int i) {
        adj[i] = adj[i] == null ? new Vector<>() : adj[i];
    }

    @SuppressWarnings("all")
    private static <T> void checkV(final ArrayList<T> adj[], final int i) {
        adj[i] = adj[i] == null ? new ArrayList<>() : adj[i];
    }

    @SuppressWarnings("all")
    private static int[] na(final int n) throws Exception {
        final int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = ni();
        }
        return a;
    }

    @SuppressWarnings("all")
    private static int[] na1(final int n) throws Exception {
        final int[] a = new int[n + 1];
        for (int i = 1; i < a.length; i++) {
            a[i] = ni();
        }
        return a;
    }

    @SuppressWarnings("all")
    private static String n() throws IOException {
        return r.readToken();
    }

    @SuppressWarnings("all")
    private static char[] ns() throws IOException {
        return r.readToken().toCharArray();
    }

    @SuppressWarnings("all")
    private static String nln() throws IOException {
        return r.readLine();
    }

    private static int ni() throws IOException {
        return r.nextInt();
    }

    @SuppressWarnings("all")
    private static long nl() throws IOException {
        return r.nextLong();
    }

    @SuppressWarnings("all")
    private static double nd() throws IOException {
        return r.nextDouble();
    }

    @SuppressWarnings("all")
    private static void p(final Object o) {
        out.print(o);
    }

    @SuppressWarnings("all")
    private static void pn(final Object o) {
        out.println(o);
    }

    @SuppressWarnings("all")
    private static void pn() {
        out.println("");
    }

    @SuppressWarnings("all")
    private static void pi(final Object o) {
        out.print(o);
        out.flush();
    }

    @SuppressWarnings("all")
    private static void pni() {
        out.println("");
        out.flush();
    }

    private static void pni(final Object o) {
        out.println(o);
        out.flush();
    }

    private static class Reader {
        private final int BUFFER_SIZE = 1 << 17;
        private final DataInputStream din;
        private final byte[] buffer;
        private int bufferPointer, bytesRead;
        // private StringTokenizer st;

        public Reader() {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        @SuppressWarnings("all")
        public Reader(final String file_name) throws IOException {
            din = new DataInputStream(new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        final byte[] buf = new byte[SCAN_LINE_LENGTH];

        public String readLine() throws IOException {
            int cnt = 0;
            int c;
            o: while ((c = read()) != -1) {
                if (c == '\n')
                    if (cnt == 0)
                        continue o;
                    else
                        break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public String readToken() throws IOException {
            int cnt = 0;
            int c;
            o: while ((c = read()) != -1) {
                if (!(c >= 33 && c <= 126))
                    if (cnt == 0)
                        continue o;
                    else
                        break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public int nextInt() throws IOException {
            int ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            final boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (neg)
                return -ret;
            return ret;
        }

        public long nextLong() throws IOException {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            final boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nextDouble() throws IOException {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            final boolean neg = (c == '-');
            if (neg)
                c = read();

            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (c == '.') {
                while ((c = read()) >= '0' && c <= '9') {
                    ret += (c - '0') / (div *= 10);
                }
            }

            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException {
            if (din == null)
                return;
            din.close();
        }
    }

    // static {
    // if (thread)
    // new Thread(null, new Runnable() {
    // @Override
    // public void run() {
    // try {
    // final int testcases = HAS_TEST_CASES ? ni() : 1;
    // for (int i = 1; i <= testcases; i++) {
    // // out.print("Case #" + (i + 1) + ": ");
    // try {
    // solve();
    // } catch (final ArrayIndexOutOfBoundsException e) {
    // e.printStackTrace(System.err);
    // System.exit(-1);
    // } catch (final Exception e) {
    // pni("idk Exception in solve");
    // e.printStackTrace(System.err);
    // System.exit(-1);
    // }
    // }
    // out.flush();
    // } catch (final Throwable t) {
    // t.printStackTrace(System.err);
    // System.exit(-1);
    // }
    // }
    // }, "rec", (1L << 28)).start();
    // }

    @SuppressWarnings({ "all", })
    private static <T> T deepCopy(final T old) {
        try {
            return (T) deepCopyObject(old);
        } catch (final IOException | ClassNotFoundException e) {
            e.printStackTrace(System.err);
            System.exit(-1);
        }
        return null;
    }

    private static Object deepCopyObject(final Object oldObj) throws IOException, ClassNotFoundException {
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
            final ByteArrayOutputStream bos = new ByteArrayOutputStream(); // A
            oos = new ObjectOutputStream(bos); // B
            // serialize and pass the object
            oos.writeObject(oldObj); // C
            oos.flush(); // D
            final ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray()); // E
            ois = new ObjectInputStream(bin); // F
            // return the new object
            return ois.readObject(); // G
        } catch (final ClassNotFoundException e) {
            pni("Exception in ObjectCloner = " + e);
            throw (e);
        } finally {
            oos.close();
            ois.close();
        }
    }

}