Pagini recente » Cod sursa (job #746430) | Cod sursa (job #2018243) | Cod sursa (job #3243820) | Cod sursa (job #182612) | Cod sursa (job #2922872)
#include <cstdio>
using namespace std;
void Get (int &x);
int a[18][100002],b[100002];
int n,m,i,j,p, x,y,e,lung;
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w", stdout);
Get(n);
Get(m);
for( i=1;i<=n;i++)
Get(a[0][i]);
for( p=1;(1<<p)<=n;p++)
for( i=1;i<=n;i++)
{
a[p][i]=a[p-1][i];
j=i+(1<<(p-1));
if(j<=n&&a[p][i]>a[p-1][j])
a[p][i]=a[p-1][j];
}
b[1]=0;
for( i=2;i<=n;i++)
b[i]=1+b[i/2];
for( i=1;i<=m;i++)
{
Get(x);Get(y);
e=b[y-x+1];
lung=(1<<e);
printf("%d",a[e][x]>a[e][y-lung+1]?a[e][y-lung+1]:a[e][x]); printf("\n");
}
}
const int Lim = 1000001;
int u = Lim - 1;
char S[Lim];
void Next () {
if (++u == Lim)
std::fread(S, 1, Lim, stdin), u = 0;
}
void Get (int &x) {
for (; S[u] < '0' || S[u] > '9'; Next());
for (x = 0; S[u] >= '0' and S[u] <= '9'; Next())
x = x * 10 + S[u] - '0';
}