#include <bits/stdc++.h> #define Nmax 100005 #define INF 1000000000 #define pii pair <int,int> #define mp make_pair #define fi first #define se second using namespace std; struct qry { int st,dr,D,ind; bool operator < (const qry &A) const { return D<A.D; } } Q[Nmax]; int ans[Nmax],n,m,v[Nmax],len,s[Nmax]; char sir[Nmax]; pii segm[Nmax]; inline void Make_sums(int D) { for(int i=1;i<=n;++i) s[i]=s[i-1]+(v[i]/D); } inline void Solve() { int i,j,Sqrt=sqrt(1.0*n); sort(Q+1,Q+len+1); for(i=1;i<=len;++i) if(Q[i].D<=Sqrt) { if(i==1 || Q[i].D>Q[i-1].D) Make_sums(Q[i].D); ans[Q[i].ind]+=s[Q[i].dr]-s[Q[i].st-1]; } else { for(j=Q[i].st;j<=Q[i].dr;++j) ans[Q[i].ind]+=(v[j]/Q[i].D); } } int main() { int i,j,x,y,z,p1,p2; qry w; #ifndef ONLINE_JUDGE freopen ("date.in", "r", stdin); freopen ("date.out", "w", stdout); #endif cin>>len>>(sir+1); for(i=1;i<=len;) { for(;i<=len && sir[i]=='1';++i); if(i>len) continue; for(j=i;j<=len && sir[j]=='0';++j); --j; segm[++n]=mp(i,j); v[n]=j-i+1; i=j+1; } //cout<<n<<"\n"; //for(i=1;i<=n;++i) cout<<segm[i].fi<<" "<<segm[i].se<<" "<<v[i]<<"\n"; cin>>m; len=0; for(i=1;i<=m;++i) { cin>>x>>y>>z; p1=upper_bound(segm+1,segm+n+1,mp(x,INF))-segm; //cout<<p1<<"--\n"; if(p1>n) continue; if(p1) ans[i] += max(segm[p1-1].se-x,0)/z; p2=upper_bound(segm+1,segm+n+1,mp(y,INF))-segm-1; //cout<<p2<<"--\n"; if(p2<p1) continue; //cout<<ans[i]<<"++\n"; if(segm[p2].se>=y) { ans[i] += max(y-segm[p2].fi,0)/z; if(p2-1>=p1) { w.ind=i; w.st=p1; w.dr=p2-1; w.D=z; //cout<<w.st<<" "<<w.dr<<" "<<ans[i]<<"\n"; Q[++len]=w; } } else { if(p2>=p1) { w.ind=i; w.st=p1; w.dr=p2; w.D=z; Q[++len]=w; } } } Solve(); for(i=1;i<=m;++i) cout<<ans[i]<<"\n"; return 0; }