Cod sursa(job #765596)

Utilizator igsifvevc avb igsi Data 8 iulie 2012 11:55:13
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.85 kb
#include <stdio.h>

FILE *in, *out;
long int RMQ[18][100001];
int N, M;

int main()
{
    int i, j, k;
    long int min;

    in = fopen("rmq.in", "r");
    out = fopen("rmq.out", "w");

    fscanf(in, "%d %d", &N, &M);
    for(i = 1; i <= N; ++i)
        fscanf(in, "%ld", &RMQ[0][i]);

    for(i = 1; (1 << i) <= N; i++)
        for(j = 1; j + (1 << i) - 1 <= N; j++)
            if(RMQ[i-1][j] <= RMQ[i-1][j + (1 << (i-1))])
                RMQ[i][j] = RMQ[i-1][j];
            else
                RMQ[i][j] = RMQ[i-1][j + (1 << (i-1))];

    for(; M; --M)
    {
        fscanf(in, "%d %d", &i, &j);
        for(k = 0; (1 << k) <= (j - i + 1); ++k); k--;

        if(RMQ[k][i] <= RMQ[k][j - (1 << k) + 1])  min = RMQ[k][i];
        else min = RMQ[k][j - (1 << k) + 1];

        fprintf(out, "%ld\n", min);
    }

    fclose(in);
    fclose(out);
    return 0;
}