Pagini recente » Cod sursa (job #590709) | Cod sursa (job #1800100) | Utilizatori inregistrati la Infoarena Monthly 2014 - Runda 6 | Cod sursa (job #2653041) | Cod sursa (job #686810)
Cod sursa(job #686810)
#include<stdio.h>
#define NMAX 100010
long lg[NMAX], rmq[18][NMAX];
inline long min(long a, long b)
{
if (a < b)
return a;
return b;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m, i, j;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
int a;
scanf("%d", &a);
rmq[0][i] = a;
}
for(i = 1; (1 << i) <= n; i++)
for(j = 1; j + (1 << i) <= n+1; j++)
{
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + (1 << (i-1))]);
}
lg[1] = 0;
for (i = 2; i <= n; i++)
lg[i] = lg[i/2] + 1;
for(i = 1; i <= m; i++)
{
int a, b;
scanf("%d %d", &a, &b);
int diff = b - a + 1;
int rem = diff - (1 << lg[diff]);
printf("%ld\n", min(rmq[lg[diff]][a], rmq[lg[diff]][a + rem]));
}
return 0;
}