Cod sursa(job #652543)

Utilizator slycerdan dragomir slycer Data 24 decembrie 2011 21:38:54
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    
   
    ofstream outfile ("rmq.out");
    ifstream infile("rmq.in");
    int n,m; 
    
    infile >> n;
    infile >> m; 
    int logarithm[100001];
    logarithm[0] = -1; 
    for ( int i=1; i<=n; i++){
        logarithm[i] = logarithm[i/2]+1;
        //cout << i << " " << logarithm[i] << endl; 
    }
    
    int log = logarithm[n];
    int st[n][ log + 1];
   // cout << endl; 
    for ( int i=0; i<n; i++ ){
        infile >> st[i][0]; 
     //   cout << " : " << st[i][0] << ", "; 
    }
    //cout << endl; 
    for ( int k=1; k<=log; k++){
        int pow = 1<<(k-1);
        for ( int i=0; i<n; i++ ){
            //int next = i + (1<<k); 
            st[i][k] = min( st[i][k-1], st[ min(n-1,i + pow ) ][k-1] );
          //  cout << st[i][k] << ", " ; 
        }
        //cout << endl; 
    }
    for ( int i=0; i<m; i++){
        int a; 
        int b;
        infile >> a >> b; 
        a--; b--;
        int logl = logarithm[ b - a + 1 ];
        int sol = min( st[a][logl], st[ b - ( 1<<logl) + 1 ][ logl ]);
        outfile << sol << endl;
    }
    return 0;
}