Cod sursa(job #1329019)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 28 ianuarie 2015 22:57:32
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#define DIM 100010
using namespace std;

ifstream fin ("rmq.in" );
ofstream fout("rmq.out");

int d[DIM][30], v[30], a, b, mid;
int n, i, j, k, ok, x, m, val, y, z;

int min(int a, int b){
    if(a < b)
        return a;
    else
        return b;
}

int main(){
    fin >> n >> m; v[0] = 1;
    for(i = 1; i <= n; i ++)
        fin >> d[0][i];
    for(i = 1, k = 1; k <= n; i ++, k *= 2){
        v[i] = k * 2;
        for(j = 1; j <= n; j ++)
            if(j + k <= n)
                d[i][j] = min(d[i-1][j], d[i-1][j+k]);
            else
                d[i][j] = min(d[i-1][j], d[i-1][j+0]);
    }
    val = i - 1;
    for(i = 1; i <= m; i ++){
        fin >> x >> y;
        z = y - x + 1;
        a = 0;b = val;
        while(a <= b){
            mid = (a + b) / 2;
            if(v[mid] <= z)
                a = mid + 1;
            else
                b = mid - 1;
        }
        mid = b - 1;
        fout << min(d[mid][x], d[mid][y - v[mid] + 1]);
        fout << '\n';
    }
    return 0;
}