Pagini recente » Borderou de evaluare (job #2016985) | Cod sursa (job #3173026) | Cod sursa (job #1902399) | Cod sursa (job #3202464) | Cod sursa (job #1901100)
#include<stdio.h>
using namespace std;
const int N = 100005, PUTERE = 16, INF = 1 << 16;
int rmq[PUTERE + 2][N], puteri[N];
int minim (int a, int b)
{
if (a < b)
return a;
return b;
}
void construieste (int n)
{
int i, p = 1, j;
for (i = 1; i <= PUTERE; i++)
{
for (j = 1; j <= n; j++)
{
if (j + p <= n)
rmq[i][j] = minim (rmq[i - 1][j], rmq[i - 1][j + p]);
}
p <<= 1;
}
p = 1;
for (i = 0; i <= 16; i++)
{
puteri[p] = i;
p <<= 1;
}
}
int interog (int a, int b)
{
int sol = INF, p, val;
while (a <= b)
{
val = puteri[(a - b) & (-(a - b))];
p = val;
sol = minim (sol, rmq[p][a]);
a += val + 1;
}
return sol;
}
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", &rmq[0][i]);
construieste (n);
int a, b;
for (i = 1; i <= m; i++)
{
fscanf (in, "%d%d", &a, &b);
fprintf (out, "%d\n", interog(a, b));
}
return 0;
}