Cod sursa(job #1097132)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 3 februarie 2014 00:55:46
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#include<algorithm>
#define DIM 100005
#define DIM2 18
using namespace std;
FILE *f=fopen("rmq.in","r"), *g=fopen("rmq.out","w");

long int n, m, v[DIM], a[DIM][DIM2], log[DIM];

    // a[i][j] = numarul minim de la i, 2^j numere

void citire_initiala(){
long int i;

    fscanf(f,"%ld %ld\n",&n,&m);
    for(i=1;i<=n;i++)fscanf(f,"%ld\n",&v[i]);

}

void initializare_a(){
long int i;

    for(i=1;i<=n;i++) a[i][0] = v[i];

}

void creare_a(){
long int j, i;

    for( j=1; (1<<j) <= n; j++ ){
        for( i=1; i+ (1<<j) -1 <= n ; i++){
            a[i][j] = min( a[ i ][ j-1 ], a[ i+ ( 1<<(j-1) ) ][ j-1 ] );
        }
    }

}

void aflare(){
long int i, x, y, dif, lg;

    log[1]=0;
    for (i=2;i<=n;i++)
        log[i]=log[i/2]+1;

    for(i=1;i<=m;i++){
        fscanf(f,"%ld %ld\n",&x,&y);

        dif = y-x+1; lg= log[dif];

        fprintf(g,"%ld\n", min( a[x][lg], a[ y-(1<<lg)+1 ][lg] ) );

    }

}

int main(){

    citire_initiala();
    initializare_a();
    creare_a();
    aflare();

return 0;
}