Cod sursa(job #770690)

Utilizator mi5humihai draghici mi5hu Data 23 iulie 2012 17:21:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <cmath>

#define NMAX 100001
#define LIMIT 17 

using namespace std;

int n, m;
int v[NMAX];
int PMin[NMAX][LIMIT];


void print_(int poz) {
     printf("%d\n", v[poz]);     
}

// Pozitia minimului;
int min(int p1, int p2) {
    return (v[p1] < v[p2] ? p1 : p2);
}

void compute_rmq() {
     for (int i = 1; i <= n; i++) {
         PMin[i][0] = i;
     }   
     for (int j = 1; j <= LIMIT; j++) {
         int Lung_Interv = 1 << j;
         for (int i = 1; i + Lung_Interv - 1 <= n; i++) {
             PMin[i][j] = min(PMin[i][j - 1], PMin[i + (1 << (j - 1))][j - 1]);
         }  
     }  
}

int get_rmq(int x, int y) {
    int k = (int)(floor(log2(y - x)));
    return min(PMin[x][k], PMin[y - (1 << k) + 1][k]);
}

void solve_() {    
     int x, y;
     for (int i = 0; i < m; i++) {
         scanf("%d%d", &x, &y);
         int poz = get_rmq(x, y);
         print_(poz);
     }     
}

void read_() {
     scanf("%d%d", &n, &m);
     for (int i = 1; i <= n; i++) {
         scanf("%d", &v[i]);
     }    
}

int main(){
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w" ,stdout);
    
    read_();
    compute_rmq();
    solve_();
    
    return 0;    
}