1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 const int maxn = 1e5+5; 6 int f[maxn][25]; 7 int n,m; 8 inline int RMQ(int l,int r){ 9 int k = log2(r-l+1); 10 return min(f[l][k],f[r-(1<<k)+1][k]); 11 } 12 inline void ST(){ 13 for(int j = 1;j <= 20;j++) 14 for(int i = 1;i <= n;i++) 15 if(i+(1<<j)-1 <= n) 16 f[i][j] = min(f[i][j-1],f[i+(1<<(j-1))][j-1]); 17 } 18 int main(){ 19 cin>>n>>m; 20 for(int i = 1;i <= n;i++) 21 scanf("%d",&f[i][0]); 22 ST(); 23 for(int i = 1,x,y;i <= m;i++){ 24 scanf("%d%d",&x,&y); 25 printf("%d ",RMQ(x,y)); 26 } 27 return 0; 28 }
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn = 1e5+5; 5 int a[maxn],f[maxn][25],log[maxn]; 6 int n,m; 7 inline int RMQ(int l,int r){ 8 int k = log[r-l+1]; 9 return min(f[l][k],f[r-(1<<k)+1][k]); 10 } 11 inline void ST(){ 12 log[0] = -1; 13 for(int i = 1;i <= n;i++){ 14 f[i][0] = a[i]; 15 log[i] = log[i>>1]+1; 16 } 17 for(int j = 1;j <= log[n];j++) 18 for(int i = 1;(i+(1<<j)-1 <= n) && (i <= n);i++) 19 f[i][j] = min(f[i][j-1],f[i+(1<<j-1)][j-1]); 20 } 21 int main(){ 22 cin>>n>>m; 23 for(int i = 1;i <= n;i++) 24 scanf("%d",&a[i]); 25 ST(); 26 for(int i = 1,x,y;i <= m;i++){ 27 scanf("%d%d",&x,&y); 28 printf("%d ",RMQ(x,y)); 29 } 30 return 0; 31 }