题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5875
代码:
#include <bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 100000 + 5;
int MIN[maxn][32];
int n;
void INIT_RMQ(){
for(int j = 1;(1 << j) <= n;++j){
for(int i = 1;(i + (1 << j) - 1)<= n;++i){
MIN[i][j] = min(MIN[i][j - 1],MIN[i + (1 << (j - 1))][j - 1]);
}
}
}
int RMQ(int l,int r){
int LEN = r - l + 1;
int k = 0;
while ((1 << (k + 1)) <= LEN) k++;
return min(MIN[l][k], MIN[r - (1 << k) + 1][k]);
}
int main(){
int T,q,l,r,value;sf("%d",&T);
while( T-- ){
sf("%d",&n);
for(int i = 1;i <= n;++i) sf("%d",&MIN[i][0]);
INIT_RMQ();
sf("%d",&q);
while(q--){
sf("%d %d",&l,&r);
value = MIN[l++][0];
while(l <= r){
int L = l,R = r;
while(L < R){
if(RMQ(L,L + R >> 1) <= value){
R = L + R >> 1;
}
else if(RMQ((L + R >> 1) + 1,R) <= value){
L = (L + R >> 1) + 1;
}
else break;
}
if(MIN[L][0] > value) break;
else value %= MIN[L][0];
if(value == 0) break;
l = L + 1;
}
pf("%d\n",value);
}
}
}