1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;
const int N=100010; int st[N][25];
void st_init(int n) { for (int i=1;(1<<i)<=n;i++) for (int j=1;j+(1<<i)-1<=n;j++) st[j][i]=min(st[j][i-1],st[j+(1<<(i-1))][i-1]); }
int st_query(int l,int r) { int k=0; while ((1<<(k+1))<=r-l+1) k++; return min(st[l][k],st[r-(1<<k)+1][k]); }
int bsearch(int l,int r,int lim) { int res=r+1; while (l<=r) { int m=(l+r)>>1; if (st_query(l,m)>lim) l=m+1; else r=m-1,res=m; } return res; }
int main() { int T,n,m; scanf("%d",&T); while (T--) { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&st[i][0]); st_init(n); scanf("%d",&m); while (m--) { int l,r; scanf("%d%d",&l,&r); int res=st[l++][0]; while (l<=r&&res) { l=bsearch(l,r,res); if (l<=r) { res%=st[l++][0]; } } printf("%d\n",res); } } return 0; }
|