Cod sursa(job #1197713)

Utilizator hrazvanHarsan Razvan hrazvan Data 13 iunie 2014 15:04:47
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#define MAXN 100000
#define LG_MAXN 16
int v[MAXN + 1], lg[MAXN + 1], rmq[LG_MAXN + 1][MAXN + 1];

int min2(int a, int b){
    return a > b ? b : a;
}

void creatermq (int n){
    int i, j;
    for (i = 1; i <= n; i++)    rmq[0][i] = v[i];
    for (i = 1; i <= lg[n]; i++){
        for (j = 1; j <= n; j++){
            if(j > (1 << (i - 1))){
                rmq[i][j] = min2(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
            }
        }
    }
    return ;
}

int main()
{
    FILE *in = fopen ( "rmq.in", "r" );
    int n, m;
    fscanf ( in, "%d%d", &n, &m );
    int i, k = 0;
    for (i = 1; i <= n; i++){
        fscanf ( in, "%d", &v[i] );
        if (i >= (1 << (k + 1)))   k++;
        lg[i] = k;
    }
    creatermq( n );
    FILE *out = fopen ("rmq.out", "w");
    int L, a, b;
    for (i = 1; i <= m; i++ ){
        fscanf (in, "%d%d", &a, &b );
        L = lg[b - a + 1];
        fprintf (out, "%d\n", min2 (rmq[L][a + (1 << L) - 1], rmq[L][b]));
    }
    fclose (in);
    fclose (out);
    return 0;
}