/*RMQ算法(ST) 求指定区间最小(大)值*/ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n; int f[100000][20];//f[i][j]表示从第i个数开始,往后数2^j个数中的最值 void init()//初始化f数组 { for(int j=1; (1<<j)<=n; j++) //1<<j=2^j for(int i=1; i+(1<<j)-1<=n; i++) f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);//最小值 //f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//最大值 } int RMQ(int x,int y)//查询[x,y] { int k=log(y-x-1)/log(2); return min(f[x][k],f[y-(1<<k)+1][k]); } int main() { cin>>n; for(int i=1; i<=n; i++) cin>>f[i][0]; init(); for(;;)//在线查询 { int x,y; cin>>x>>y; cout<<RMQ(x,y)<<endl; } return 0; }