Pagini recente » Cod sursa (job #2053853) | Cod sursa (job #1077495) | Cod sursa (job #866157) | Cod sursa (job #866133) | Cod sursa (job #2419985)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
int a[nmax], rmq[nmax][25];
int n, m, x, y;
int dist, add, og2;
int l2(int x)
{
if (x<=1) return 0;
int ans = 0, p2 = 1;
while(true)
{
if (p2>x) return ans-1;
++ans, p2*=2;
}
}
int main()
{
scanf("%d %d",&n,&m);
for (int i=1;i<=n;++i)
scanf("%d",&a[i]);
for (int i=1;i<=n;++i)
rmq[i][0] = i;
for (int j=1;(1<<j)<=n;++j)
for (int i=1;i+(1<<j)-1<=n;++i)
if (a[rmq[i][j-1]] < a[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];
for (int i=1;i<=m;++i)
{
scanf("%d %d",&x,&y);
if (x > y) swap(x,y);
dist = y - x + 1;
og2 = l2(dist);
add = dist - (1<<og2);
if (a[rmq[x][og2]] < a[rmq[x+add][og2]])
printf("%d\n",a[rmq[x][og2]]);
else
printf("%d\n",a[rmq[x+add][og2]]);
}
return 0;
}