Pagini recente » Cod sursa (job #2140359) | Cod sursa (job #512934) | Cod sursa (job #460737) | Cod sursa (job #1603428) | Cod sursa (job #1631279)
#include<stdio.h>
using namespace std;
const int N = 20, M = 100005;
int d[N][M], log[N], pre[M];
void precalculare (int n)
{
int i, p = 1, c = 0;
for (i = 0; i <= N - 2; i++)
{
log[i] = c;
p <<= 1;
++c;
}
p = 1;
int ct = 0;
for (i = 1; i <= n; i++)
{
if ((p << 1) <= i)
{
p <<= 1;
ct++;
}
pre[i] = ct;
}
}
int putere (int n)
{
int p = 1, ct = 0;
while (p <= n)
{
p <<= 1;
ct++;
}
return ct;
}
int minim (int a, int b)
{
if (a < b)
return a;
return b;
}
int main ()
{
FILE *in, *out;
in = fopen ("rmq.in", "r");
out = fopen ("rmq.out", "w");
int n, m;
fscanf (in, "%d%d", &n, &m);
int i;
for (i = 1; i <= n; i++)
fscanf (in, "%d", &d[0][i]);
precalculare(n);
int p = putere(n);
int j;
for (i = 1; i <= p; i++)
for (j = 1; j <= n; j++)
if (j + log[i] <= n)
d[i][j] = minim (d[i - 1][j], d[i - 1][j + log[i]]);
int x, y, aux;
for (i = 1; i <= m; i++)
{
fscanf (in, "%d%d", &x, &y);
if (y < x)
{
aux = x;
x = y;
y = x;
}
p = pre[y - x];
fprintf (out, "%d\n", minim (d[p][x], d[p][y - p]));
}
return 0;
}