Pagini recente » Cod sursa (job #2279792) | Cod sursa (job #1945568) | Cod sursa (job #2625568) | Cod sursa (job #1694471) | Cod sursa (job #1312440)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,q,a[100001],m[100000][20];
int logaritm2(int var)
{
int au=0; while ((1<<au)<=var)au++;
return au-1;
}
void preproc()
{
int i,j;
for(i=0; i<n; i++)m[i][0]=i;
for(j=1; (1<<j)<n; j++)
for(i=0; i+(1<<j)-1 < n; i++)
if(a[m[i][j-1]] < a[m[i+(1<<(j-1))][j-1]])
m[i][j]=m[i][j-1];
else m[i][j]=m[i+(1<<(j-1))][j-1];
}
int calcul(int i, int j)
{
int k=logaritm2(j-i+1);
if(a[m[i][k]] < a[ m[j-(1<<k)+1][k]])
return m[i][k];
else return m[j-(1<<k)+1][k];
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
cin>>n>>q;
for(int i=0; i<n; i++)scanf("%d",&a[i]);
preproc();
int a1,b1;
for(int i=1; i<=q; i++)
{
scanf("%d %d",&a1,&b1);
printf("%d\n",a[calcul(a1-1,b1-1)]);
}
return 0;
}