Pagini recente » Cod sursa (job #2602714) | Cod sursa (job #2492267) | Cod sursa (job #2430946) | Cod sursa (job #2858890) | Cod sursa (job #1631244)
#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;
for (i = 0; i <= N - 2; i++)
{
log[i] = p;
p <<= 1;
}
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 p>>1;
}
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 - 1] <= n)
d[i][j] = minim (d[i - 1][j], d[i - 1][j + log[i - 1]]);
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;
}