#include<bits/stdc++.h>
using namespace std;

int n, c, q;
bool niz[200010];
struct Segm{
    int broj, lazy;
} st[800010];
void propagate(int node, int tl, int tr) {
    if(st[node].lazy&1) {
        st[node].broj=(tr-tl+1)-st[node].broj;
        st[node].lazy=1;
        if(tl<tr) {
            ++st[2*node].lazy;
            ++st[2*node+1].lazy;
        }
        st[node].lazy=0;
    }
    else st[node].lazy=0;
}
void build(int node, int tl, int tr) {
    if(tl==tr) {st[node].broj=niz[tl]; return;}
    int mid=(tl+tr)/2;
    build(2*node, tl, mid);
    build(2*node+1, mid+1, tr);
    st[node].broj=st[2*node].broj+st[2*node+1].broj;
}
void update(int node, int tl, int tr, int gl, int gr) {
    propagate(node, tl, tr);
    if (tl>=gl && tr<=gr) {++st[node].lazy; return;}
    int mid=(tl+tr)/2;
    if (gl<=mid) update(2*node, tl, mid, gl, gr);
    if (gr>=mid+1) update(2*node+1, mid+1, tr, gl, gr);
    propagate(2*node, tl, mid);
    propagate(2*node+1, mid+1, tr);
    st[node].broj = st[2*node].broj+st[2*node+1].broj;
}
int query(int node, int tl, int tr, int gl, int gr) {
    propagate(node, tl, tr);
    if(tl>=gl && tr<=gr) return st[node].broj;
    int uk=0;
    int mid=(tl+tr)/2;
    if(gl<=mid) uk+=query(2*node, tl, mid, gl, gr);
    if(gr>=mid+1) uk+=query(2*node+1, mid+1, tr, gl, gr);
    return uk;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n >> c >> q;
    if(c==n) {
        /// optimalno je da okrecemo jedan po jedan -> resenje je broj keceva u nizu

        for(int i=1; i<=n; ++i) {
            char c; cin >> c;
            niz[i]=c-'0';
        }
        build(1, 1, n);
        while(q--) {
            int l, r; cin >> l >> r;
            update(1, 1, n, l, r);
            cout << query(1, 1, n, 1, n) << "\n";
        }
    }
    else if(c==1) {
        ///
    }
    else {
        /// n^2
    }
}