Pagini recente » Borderou de evaluare (job #809397) | Autentificare | Monitorul de evaluare | Cod sursa (job #1131191) | Cod sursa (job #1373717)
#include<cstdio>
#define NMAX 100001
#define LMAX 19
#define min(a,b) (a < b ? a : b)
using namespace std;
int n, m, i, j, l ,sh, dif, x, y;
int rmq[LMAX][NMAX];
int lg[NMAX], v[NMAX];
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&v[i]);
rmq[0][i]=i;
}
lg[1]=0;
for (i=2;i<=n;++i)
lg[i]=lg[i/2]+1;
for(int i = 1; (1<<i) <= n; ++i)
for(int j = 1; j <= n - (1<<i) + 1; ++j)
{
int l = 1 << (i-1);
if (v[rmq[i-1][j]] <= v[rmq[i-1][j+l]]) rmq[i][j]=rmq[i-1][j];
else rmq[i][j] = rmq[i-1][j+l];
}
for(int i = 1; i <= m; ++i)
{
scanf("%d%d",&x,&y);
dif = y-x+1;
l = lg[dif];
sh = dif - (1<<l);
printf("%d\n",min(v[rmq[l][x]],v[rmq[l][x+sh]]));
}
return 0;
}