Cod sursa(job #1749289)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 28 august 2016 11:12:45
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>

#define LOG_N 17

FILE *in, *out;

int d[LOG_N + 1][100000];

int miiin(int a, int b)
{
    if(a < b) {
        return a;
    } else {
        return b;
    }
}

int main ()
{

    int n, m ,i, j;

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

    fscanf(in, "%d%d", &n, &m);

    for(i = 0; i < n; i++) {
        fscanf(in, "%d", &d[0][i]);
    }
    int pas = 1;
    for(i = 1; i <= LOG_N; i++) {
        for(j = 0; j < n; j++) {
            if(j + pas < n) {
                d[i][j] = miiin(d[i - 1][j], d[i - 1][j + pas]);
            } else {
                d[i][j] = d[i - 1][j];
            }
        }
        pas = pas << 1;
    }

/*
    for(i = 0; i <= 3; i++) {
        for(j = 0; j < n; j++) {
            printf("%d ", d[i][j]);
        } printf("\n");
    }
*/

    int a, b, e, l;

    for(i = 0; i < m; i++) {
        fscanf(in, "%d%d", &a, &b);
        e = 1;
        l = 0;
        while((e << 1) <= (b - a + 1)) {
            e = e << 1;
            l++;
        }
        fprintf(out, "%d\n", miiin(d[l][a - 1], d[l][b - e]));
    }

    fclose(in);
    fclose(out);

    return 0;
}