Pagini recente » Cod sursa (job #2126344) | Cod sursa (job #2309332) | Cod sursa (job #876464) | Cod sursa (job #2054522) | Cod sursa (job #2476137)
#include <fstream>
#include <math.h>
#include <stdlib.h>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int x[100005],n,m,i,r[100005][20],j,a,b;
int hatv(int a,int b)
{
if(b==0) return 1;
else
{
int k=hatv(a,b/2);
if(b%2==0) return k*k;
else return k*k*a;
}
}
void elkeszit()
{
int l;
//i+(1<<j)-1
for(i=0;i<n;++i) r[i][0]=i;
for(j=1;(1<<j)<=n;++j)
for(i=0;i<n;++i)
{
l=min(n-1,i+(1<<(j-1)));
if(x[r[i][j-1]]<x[r[l][j-1]])
r[i][j]=r[i][j-1];
else r[i][j]=r[l][j-1];
}
}
int rmq(int a, int b)
{
int k,l,m;
k=log2(b-a+1);
l=min(b,a+(1<<k)+1);
m=log2(abs(l-b)+1);
//if(l+1<<k+1)
if(x[r[a][k]]<=x[r[l/*hatv(2,k)*/][m]])
return r[a][k];
else return r[l/*hatv(2,k)*/][m];
}
int main()
{
cin>>n>>m;
for(i=0;i<n;++i)
cin>>x[i];
elkeszit();
/*for(i=0;i<n;++i)
{
for(j=0;(1<<j)<=n;++j)
cout<<r[i][j]<<" ";
cout<<"\n";
}*/
for(i=1;i<=m;++i)
{
cin>>a>>b;
cout<<x[rmq(a-1,b-1)]<<"\n";
}
return 0;
}