#include #include #include using namespace std; const int LimMax = 320, NMax = 1e5+5; int n, q, lim, i, x, y, cost, nr; int start[NMax], stop[NMax], sum[LimMax][NMax], Prev[NMax], Next[NMax]; vector v; char A[NMax]; void precompute() { int i, j; for(i=1; i<=n; ++i) if(A[i]=='0') { start[++nr] = i; while(A[i]=='0') ++i; stop[nr] = i-1; if(stop[nr] - start[nr] + 1 > lim) v.push_back(nr); } for(i=1; i<=lim; ++i) for(j=1; j<=nr; ++j) sum[i][j] = sum[i][j-1] + (stop[j] - start[j] + 1) / i; stop[0] = 0; start[nr+1] = n; Next[n+1] = nr+1; for(i=n; i; --i) if(start[Next[i+1]-1] == i) Next[i] = Next[i+1] - 1; else Next[i] = Next[i+1]; Prev[0] = 0; for(i=1; i<=n; ++i) if(stop[Prev[i-1]+1] == i) Prev[i] = Prev[i-1] + 1; else Prev[i] = Prev[i-1]; } int solve1(int x, int y, int cost) { int ans=0; if(Prev[y] != 0 && Next[x] != nr+1) ans = sum[cost][Prev[y]] - sum[cost][Next[x]-1]; if(start[Next[x]-1]<=x && stop[Next[x]-1]>=y) return (y-x+1)/cost; if(x <= stop[Next[x]-1]) ans += (stop[Next[x]-1] - x + 1) / cost; if(y >= start[Prev[y]+1]) ans += (y - start[Prev[y]+1] + 1) / cost; return ans; } int solve2(int x, int y, int cost) { int x0, y0, ans=0; for(auto i : v) { x0 = max(x, start[i]); y0 = min(y, stop[i]); if(x0<=y0) ans += (y0 - x0 + 1) / cost; } return ans; } int main() { // freopen("input", "r", stdin); // freopen("output", "w", stdout); scanf("%d\n", &n); scanf("%s\n", A+1); scanf("%d\n", &q); lim = sqrt(n); precompute(); while(q--) { scanf( "%d%d%d", &x, &y, &cost ); if(y-x<=1) { printf("0\n"); continue; } ++x; --y; printf( "%d\n", cost<=lim ? solve1(x, y, cost) : solve2(x, y, cost) ); } return 0; }