Cod sursa(job #1901100)

Utilizator DiClauDan Claudiu DiClau Data 3 martie 2017 18:58:39
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#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;
}