#include<stdio.h> #include<string.h> #include<math.h> #define MAX 1000000+10 #define Max(a,b) a>b?a:b #define Min(a,b) a<b?a:b int f[MAX][30]; int a[MAX]; int n; void init(){ for(int i=1;i<=n;i++){ for(int j=1;j<=20;j++){ int t = j+(1<<(i-1)); if(t<=n) f[j][i]=Min(f[j][i-1],f[t][i-1]); else f[j][i]=f[j][i-1]; } } return ; } void write(int l,int r){ int m=floor(log((double)(r-l+1))/log(2.0)); int ans=Min(f[l][m],f[r-(1<<m)+1][m]); printf("%d\n",ans); return ; } int main(){ int q,l,r; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ scanf("%d",a+i); f[i][0]=a[i]; } init(); scanf("%d",&q); while(q--){ scanf("%d%d",&l,&r); write(l,r); } } return 0; } |
Double click to view unformatted code.