Cod sursa(job #2294806)

Utilizator DragosArseneDragos Arsene DragosArsene Data 2 decembrie 2018 20:17:06
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <stdio.h>
using namespace std;

int log[100001];
int pow2[18];
int main() {
    FILE *fin, *fout;
    int n, i, j, logn, p2, nrquerry, it, x, y, d, rmq;
    int lookup_table[18][100001];
fin = fopen("st.in", "r");
fout = fopen("st.out", "w");

fscanf(fin,"%d%d", &n, &nrquerry);

for(i=1;i<=n;i++){
    fscanf(fin,"%d", &lookup_table[0][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<=logn;i++){
    for(j=1;j+(1<<i)-1<=n;j++){
        if(lookup_table[i-1][j]<lookup_table[i-1][j+(1<<i-1)])
        lookup_table[i][j]=lookup_table[i-1][j];
        else
        lookup_table[i][j]=lookup_table[i-1][j+(1<<i-1)];

    }


}





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]);
    fprintf(fout,"%d\n", rmq);
}

fclose(fin);
fclose(fout);


    return 0;
}