Cod sursa(job #1497844)

Utilizator Master011Dragos Martac Master011 Data 7 octombrie 2015 16:43:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<cstdio>
using namespace std;

const int nMax = 100002, lMax = 18;
int d[lMax][nMax], lg[nMax];
int n,m;

int minim(int a, int b){
    return a < b ? a : b;
}

int main (){
    FILE *in = fopen("rmq.in","r");
    fscanf(in,"%d%d", &n, &m);

    for(int i = 2 ; i <= n ; ++i) lg[i] = lg[i / 2] + 1;

    for(int i = 1 ; i <= n ; ++i){
        fscanf(in,"%d", &d[0][i]);
    }

    for(int i = 1 ; i <= lg[n] ; ++i){
        for(int j = 1 ; j <= n - (1 << i) + 1; ++j){
            d[i][j] = minim(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
        }
    }

    int a, b, l, diff;
    FILE *out = fopen("rmq.out","w");
    for(int i = 0 ; i < m ; ++i){
        fscanf(in,"%d%d", &a, &b);
        diff = b - a + 1;
        l = lg[diff];
        fprintf(out,"%d\n", minim(d[l][a], d[l][a + diff - (1 << l)]));
    }

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