Cod sursa(job #1329045)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 28 ianuarie 2015 23:23:28
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 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;
        if(x == y)
            fout << d[0][x] << '\n';
        else{
            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;
}