Pagini recente » Cod sursa (job #1671073) | Cod sursa (job #1070407) | Cod sursa (job #2460792) | Cod sursa (job #2506630) | Cod sursa (job #3250358)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000
int v[MAXN + 1];
int m[17][100000]; ///log2(100000) = 16
int put[17];
int minim (int a, int b)
{
if (a < b)
{
return a;
}
return b;
}
void calculare(int N)
{
int i, j;
for (i = 1; i <= N; i++)
{
m[0][i] = v[i];
}
put[0] = 1;
for (i = 1; i <= 16; i++)
{
put[i] = put[i - 1] * 2;
}
for (i = 1; (1 << i) <= N; i++)
{
for (j = 1; j <= N - (1 << i) + 1; j++)
{
m[i][j] = minim(m[i - 1][j], m[i - 1][j + (1 << (i - 1))]);
}
}
}
int cb(int nr)
{
int st = 0, dr = 16, m, sol = -1;
while (st <= dr)
{
m = (st + dr) / 2;
if (put[m] <= nr)
{
sol = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return sol;
}
int main()
{
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
int N, M, i, a, b;
fscanf(fin, "%d%d", &N, &M);
for (i = 1; i <= N; i++)
{
fscanf(fin, "%d", &v[i]);
}
calculare(N);
for (i = 1; i <= M; i++)
{
fscanf(fin, "%d%d", &a, &b);
int rez = cb(b - a + 1);
fprintf(fout, "%d\n", minim(m[rez][a], m[rez][b - rez]));
}
fclose(fin);
fclose(fout);
return 0;
}