Pagini recente » Cod sursa (job #3221439) | Cod sursa (job #1962658) | Cod sursa (job #149447) | Cod sursa (job #1385510) | Cod sursa (job #1095817)
#include <fstream>
#define NMAX 100005
using namespace std;
FILE* f=freopen("rmq.in","r",stdin);
FILE* o=freopen("rmq.out","w",stdout);
int n,m;
int v[NMAX];
int rmq[NMAX][20];
int a,b;
int Log(int x)
{
int r=0;
for(int i=1;i<=x;i<<=1,r+=1);
return r-1;
}
void Preprocessing()
{
for(int i=0;i<n;++i)
rmq[i][0]=i;
for(int j=1;1<<j<=n;++j)
for(int i=0;i+(1<<j)-1<n;++i)
if(v[rmq[i][j-1]]<v[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j]=rmq[i][j-1];
else
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
int RMQ(int i, int j)
{
int k=Log(j-i+1);
int a=rmq[i][k];
int b=rmq[j-(1<<k)][k];
if(v[a]>v[b]) return b;
return a;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%d",&v[i]);
Preprocessing();
for(int i=0;i<m;++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",v[RMQ(a,b)]);
}
return 0;
}