#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace FastIO {
char buf[1 << 21], *p1 = buf, *p2 = buf;
// #define getchar() (p1 == p2 && (p1 == (p2 = ((p1 = buf) + fread(buf, 1, 1 << 21, stdin))))? EOF : *p1++)
template <typename T> inline T read() { T x = 0, w = 0; char ch = getchar(); while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar(); while ('0' <= ch && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar(); return w ? -x : x; }
void read(char s[]){ char ch=getchar(),*p=s; while(isspace(ch)) ch=getchar(); while(!isspace(ch)) *p++=ch,ch=getchar();*p='\n'; }
template <typename T> inline void write(T x) { if (!x) return; write<T>(x / 10), putchar((x % 10) ^ '0'); }
template <typename T> inline void print(T x) { if (x > 0) write<T>(x); else if (x < 0) putchar('-'), write<T>(-x); else putchar('0'); }
template <typename T> inline void print(T x, char en) { print<T>(x), putchar(en); }
}; using namespace FastIO;
#undef getchar
const int maxn = 2e5+10,mod = 1e9+7;
int n,q;
ll m;
__int128 nxt[maxn][70];
int pre[maxn];
char s[maxn];
bool no_one(){
for(int i=0;i<n;++i)
if(s[i]=='1')
return 0;
return 1;
}
void Init(){
if(no_one()){
for(int i=0;i<n;++i)
nxt[i][0]=1;
}else{
int l=1,r=2,cnt=0;
while(cnt<n){
while(s[l%n]!='1') l++;
r=l+1;
while(s[r%n]!='1'){
pre[r%n]=r-l;
r++;
cnt++;
}
pre[r%n]=r-l;
cnt++;
l=r;
}
ll pos=n-1+m;
for(int i=n-1;i>=0;--i){
while(pos-i>m) pos-=pre[pos%n];
if(pos<=i) nxt[i][0]=1;
else nxt[i][0]=pos-i;
}
}
for(int j=1;j<=66;++j)
for(int i=0;i<n;++i)
nxt[i][j]=nxt[i][j-1]+nxt[(nxt[i][j-1]+i)%n][j-1];
}
int main(){
n=read<int>();
m=read<ll>();
q=read<int>();
read(s);
Init();
while(q--){
ll pos=read<ll>();
ll k=read<ll>();
pos--;
__int128 dis=0;
for(int i=0;i<=63;++i){
if((k>>i)&1){
dis+=nxt[(pos+dis)%n][i];
}
}
print((pos+dis+1)%mod,'\n');
}
return 0;
}
WA #11