#include using namespace std; #define PII pair int main() { //freopen("800.in","r",stdin); int n; scanf("%d", &n); char tmp[100 * 1000 + 5]; scanf("%s",tmp); string v = tmp; vector prv(n, -1), nxt(n, n); for(int i = 1; i < n; ++i) { prv[i] = prv[i - 1]; if(v[i - 1] == '1') prv[i] = i - 1; } for(int i = n - 2; i >= 0; --i) { nxt[i] = nxt[i + 1]; if(v[i + 1] == '1') nxt[i] = i + 1; } int CHUNK = 1; while(CHUNK * CHUNK < n) ++CHUNK; vector all; for(int i = 1; i < n; ++i) { if(v[i] == '0') continue; all.push_back(make_pair(max(0, prv[i]), i)); } if(v[n - 1] != '1') all.push_back(make_pair(max(0, prv[n - 1]), n - 1)); int m; cin >> m; vector a(m, 0), b(m, 0), c(m, 0); vector ans(m, 0); vector> L(2 * CHUNK, vector()); for(int i = 0; i < m; ++i) { scanf("%d %d %d", &a[i], &b[i], &c[i]); a[i]--, b[i]--; if(c[i] <= CHUNK) { L[c[i]].push_back(i); } } auto calc = [&] (int len, int c) { return max(0, len / c - (len % c == 0)); }; for(int c = 1; c <= CHUNK; ++c) { int sz = all.size(); vector part(sz + 1, 0); for(int i = 0; i < sz; ++i) { int len = all[i].second - all[i].first; part[i] = calc(len, c); if(i - 1 >= 0) part[i] += part[i - 1]; } for(auto q : L[c]) { if(nxt[a[q]] >= b[q]) { ans[q] = calc(b[q] - a[q], c); continue; } ans[q] += calc(nxt[a[q]] - a[q], c); ans[q] += calc(b[q] - prv[b[q]], c); int lf = nxt[a[q]]; int rt = prv[b[q]]; if(rt > lf) { auto beg = lower_bound(all.begin(), all.end(), make_pair(lf, min(n - 1, nxt[lf]))) - all.begin(); auto end = lower_bound(all.begin(), all.end(), make_pair(max(0, prv[rt]), rt)) - all.begin(); int temp = part[end]; if(beg >= 1) temp -= part[beg - 1]; ans[q] += temp; } } } for(int i = 0; i < m; ++i) { if(c[i] > CHUNK) { int start = a[i], last = -1; while(start < b[i]) { start = min(b[i], start + c[i]); if(start == b[i]) break; if(prv[start] < last) { ans[i]++; } else { last = start; start = prv[start]; } } } } for(int i = 0; i < m; ++i) cout << ans[i] << "\n"; }