Pagini recente » Cod sursa (job #2710869) | Cod sursa (job #1250932) | Cod sursa (job #1642272) | Cod sursa (job #2659627) | Cod sursa (job #2472749)
#include <bits/stdc++.h>
#define NMAX (int)(1e5 + 5)
using namespace std;
int n, q, vec[NMAX] ,l, r;
int rmq[NMAX][20], pMax[NMAX];
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; ++i)
scanf("%d", &vec[i]);
//build RMQ
for (int i = 1; i <= n; ++i) {
rmq[i][0] = i;
//pMax[i] = max x, where 2^x <= i
if (1 << (pMax[i-1] + 1) <= i)
pMax[i] = pMax[i-1] + 1;
else pMax[i] = pMax[i-1];
}
for (int i = 1; (1 << i) <= n; ++i) {
int p = 1 << i;
int pAdd = 1 << (i-1);
for (int j = 1; (j - 1) + p <= n; ++j) {
if (vec[rmq[j][i-1]] < vec[rmq[j + pAdd][i-1]])
rmq[j][i] = rmq[j][i-1];
else rmq[j][i] = rmq[j + pAdd][i-1];
}
}
while (q--) {
scanf("%d %d", &l, &r);
int dist = r - l + 1;
int p = pMax[dist];
printf("%d\n", min(vec[rmq[l][p]], vec[rmq[l + dist - (1 << p)][p]]));
}
return 0;
}