Pagini recente » Cod sursa (job #2544145) | Cod sursa (job #2913431) | Cod sursa (job #43184) | Cod sursa (job #1626530) | Cod sursa (job #2221171)
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, x, y, rmq[100010][28], rez;
void build()
{
for(int j = 1; (1<<j)<=n; j++)
for(int i = 0; i + (1<<j) - 1 < n; i++)
{
if(rmq[i][j-1] < 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 query(int l, int r)
{
int sz = r - l + 1;
int k = 1, p = 0;
while(k*2 <= sz)
{k*=2;p++;}
if(k == sz)
return rmq[l][p];
else return rmq[l][p]<rmq[l+sz-k][p]?rmq[l][p]:rmq[l+sz-k][p];
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
scanf("%d", &rmq[i][0]);
build();
for(;m;m--)
{
scanf("%d%d", &x, &y);
printf("%d\n", query( x-1, y-1));
}
return 0;
}