Pagini recente » Cod sursa (job #2895511) | Cod sursa (job #1238293) | Cod sursa (job #1541551) | Cod sursa (job #853329) | Cod sursa (job #1729492)
#include<cstdio>
#include<cmath>
#define NMax 100002
using namespace std;
FILE *fin = freopen("rmq.in", "r", stdin);
FILE *fout = freopen("rmq.out", "w", stdout);
int N, M;
int place, k, d;
int v[NMax], w[NMax][20], p[22];
void Power()
{
p[0] = 1;
for (int i = 1; i <= 20; i++)
p[i] = p[i - 1] * 2;
}
void RMQ()
{
for (int i = 1, X, Y; i <= M; i++)
{
scanf("%d%d", &X, &Y);
d = ((log(Y - X + 1) / log(2)));
if (v[w[X][d]] > v[w[Y - p[d] + 1][d]])
printf("%d\n", v[w[Y - p[d] + 1][d]]);
else
printf("%d\n", v[w[X][d]]);
}
}
void Process()
{
for (int i = 1; i <= N; i++)
w[i][0] = i;
int place = 1;
for (int i = 1; i <= k; i++)
{
for (int j = 1; j <= N - place + 1; j++)
{
if (v[w[j][i - 1]] < v[w[j + place][i - 1]])
w[j][i] = w[j][i - 1];
else
w[j][i] = w[j + place][i - 1];
}
place *= 2;
}
}
int main()
{
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++)
scanf("%d", &v[i]);
k = (log(N) / log(2));
Process();
Power();
RMQ();
}