#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int mod = 1e9 + 7;
constexpr int N = 4e5 + 10;
namespace FastIO {
char buf[1 << 21], *p1 = buf, *p2 = buf;
#define getchar() (p1 == p2 && (p1 = buf, p2 = (p1 + fread(buf, 1, 1 << 21, stdin))) == p1 ? 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; }
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;
namespace solution
{
int n,m,q;
char s[N];
queue <int> que;
__int128_t f[N][64];
int g[N][64];
int lst[N];
void solve()
{
cin>>n>>m>>q;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=n;i<n*2-2;i++) s[i] = s[i%n];
for(int i=n*2-2;i>=0;i--) //拿队列做的,其实就是双指针,这里断环为链处理
{
while(que.size() && que.front() - i > m) que.pop();
if(!que.empty()) lst[i] = que.front();
else lst[i] = i + 1; // 每个点向右跳 1 步能到的位置
if(s[i] == '1') que.push(i);
}
for(int i=0;i<n;i++)
{
g[i][0] = lst[i]%n;
f[i][0] = (lst[i] - i);
}
for(int j=1;j<=63;j++)
for(int i=0;i<n;i++) {f[i][j] = (f[g[i][j-1]][j-1] + f[i][j-1]);g[i][j] = g[g[i][j-1]][j-1];}
while(q--)
{
int s,x;
cin>>s>>x;
s --;
__int128_t ans = 1LL * (s+1);
s %= n;
for(int i=63;i>=0;i--) {if(x & (1LL<<i)){ans = (ans + f[s][i]);s = (g[s][i]);}}
print(ans%mod,'\n');
}
return;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
solution::solve();
return 0;
}
大样例通过情况:通过了 kingdom1.in,kingdom2.in,kingdom4.in
/kel