Cod sursa(job #2294736)

Utilizator DragosArseneDragos Arsene DragosArsene Data 2 decembrie 2018 19:22:58
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <stdio.h>
using namespace std;
const int NMAX=100001;
int lookup_table[NMAX][18];
int q = 2147483647;
int log[NMAX];
int pow2[18];
int main() {
    FILE *fin, *fout;
    int v[NMAX];;
    int n, i, j, logn, p2, nrquerry, it, x, y, d, rmq;

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

fscanf(fin,"%d", &n);
fscanf(fin,"%d", &nrquerry);
for(i=1;i<=n;i++){
    fscanf(fin,"%d", &v[i]);
}
pow2[0]=1;
for(i=1;i<=18;i++){
    pow2[i]=pow2[i-1]*2;
}
p2=1;
log[1]=0;
for(i=2;i<=n+1;i++){
    if(i==2*p2){
    p2*=2;
    log[i]=log[i-1]+1;
    }
    else
    log[i]=log[i-1];
}
i=1;
logn=0;
while(i<n){
    if(i*2<=n){
    i*=2;
    logn++;
    }
    else
    i*=2;
}

for(i=1;i<=n;i++){
    lookup_table[0][i]=v[i];
}

for(i=1;i<=logn;i++){
    for(j=1;j<=n-pow2[i]+1;j++){
        lookup_table[i][j]=min(lookup_table[i-1][j], lookup_table[i-1][j+(1<<i-1)]);
    }
    for(j=n-pow2[i]+2;j<=n;j++)
        lookup_table[i][j]= q;

}

/*
for(i=0;i<=logn;i++){
    for(j=1;j<=n;j++){
        if(lookup_table[i][j]!=q)
        fprintf(fout,"%d ", lookup_table[i][j]);
        else
        fprintf(fout,"- ");
    }
    fprintf(fout,"\n");
}
*/


for(it=1;it<=nrquerry;it++){
    fscanf(fin,"%d%d", &x, &y);
    d=y-x+1;
    rmq=min(lookup_table[log[d-1]][x], lookup_table[log[d-1]][y-(1<<log[d-1])+1]);
    fprintf(fout,"%d\n", rmq);
}

fclose(fin);
fclose(fout);


    return 0;
}