Cod sursa(job #1651163)

Utilizator valentin50517Vozian Valentin valentin50517 Data 12 martie 2016 14:51:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001 
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
 
 // taloul R va reprezenta RMQ-ul nostru
int N,M,R[NMAX][18],x,y; // log2NMAX = 18; 
int log2s(int n){ // functia care returneaza parteea intreaga logaritmului
    return trunc(log2(n*1.0));
}
int query(int l,int r){
    return min(R[l][log2s(r-l+1)] , R[r-(1<<log2s(r-l+1))+1][log2s(r-l+1)]);
}
int main(){
    fin >> N >> M;
	// pentru a economisi spatiu citim datele deodata in tabloul R
    for(int i = 1;i<=N;i++) fin >> R[i][0];
     
    for(int k = 1;(1<<k) <= N;k++)
        for(int i = 1;i<= N - (1<<k);i++){ // (1<<k) = 2^k
                R[i][k] = min(R[i][k-1],R[i+(1<<k-1)][k-1]); 
        }
		
    for(int i = 0;i<M;i++){
        fin >> x >> y;
        fout << query(x,y) << '\n';
    }
    return 0;
}