Cod sursa(job #1631279)

Utilizator DiClauDan Claudiu DiClau Data 5 martie 2016 14:24:10
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#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;
}