Pagini recente » Cod sursa (job #1141505) | Cod sursa (job #2190792) | Cod sursa (job #3229036) | Cod sursa (job #265932) | Cod sursa (job #2805857)
#include <cstdio>
#define N 100002
#include <iostream>
using namespace std;
FILE* f, * g;
int log[N], pd[20][N];
int main()
{
f = fopen("rmq.in", "r");
g = fopen("rmq.out", "w");
int n, m;
fscanf(f, "%d %d", &n, &m);
int x;
log[0] = -1;
for (int i = 1;i <= n;++i)
{
fscanf(f, "%d", &pd[0][i]);
log[i] = 1 + log[i / 2];
}
int poz;
///in pd[i][j] va fi valoarea minima din intervalul (j, j + 2^i - 1)
for (int i = 1;i <= log[n];++i)
{
poz = (1 << (i - 1));
for (int j = 1;j + poz <= n;++j)
pd[i][j] = min(pd[i - 1][j], pd[i - 1][j + poz]);
}
int a, b, dif, val, lin;
for (int i = 1;i <= m;++i)
{
fscanf(f, "%d %d", &a, &b);
dif = b - a + 1;
lin = log[dif];
poz = (1 << lin);
val = min(pd[lin][a], pd[lin][b - poz + 1]);
fprintf(g, "%d\n", val);
}
fclose(f);
fclose(g);
return 0;
}