Cod sursa(job #1197135)

Utilizator nicnic28nichita trita nicnic28 Data 10 iunie 2014 21:02:11
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <fstream>
using namespace std;

fstream in("rmq.in",ios::in),out("rmq.out",ios::out);
const int N=1+1e5;
int lg[N],m[20][N];
#define mi(a,b) a<b?a:b

void log(int n){
    for(int i=1,e=1 ; i<=n ; i++){
        if((1<<e)==i) e++;
        lg[i]=e;
    }
}
void precalc(int n){
    for(int i=1 ; i<=lg[n] ; i++){
        for(int j=i ; j<=n ; j++){
            m[i][j]=mi(m[i-1][j],m[i-1][j-(1<<(i-1))]);
        }
    }
}
int rmq(int a, int b){
    int l=lg[b-a+1];
    return mi(m[l][a+(1<<l)-1],m[l][b]);
}

int main()
{
    int n,q,a,b;
    in>>n>>q;
    log(n);
    for(int i=1 ; i<=n ; i++){
        in>>m[0][i];
    }
    precalc(n);
    for(int i=0 ; i<=lg[n] ; i++){
        for(int j=1 ; j<=n ; j++){
            cout<<m[i][j]<<' ';
        }cout<<'\n';
    }
    while(q--){
        in>>a>>b;
        out<<rmq(a,b)<<'\n';
    }
    return 0;
}