Cod sursa(job #1514623)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 31 octombrie 2015 13:02:45
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
//#define minim(a,b) (a<b)?a:b
#define maxim(a,b) (a>b)?a:b
using namespace std;

int v[100001][20];
int log[100000];
int i, k, j, n, c, c2, l, rez;

void citire();

int minim(int x, int y)
{
    return x < y ? x : y;
}
ifstream in("rmq.in");

int main(){
    for (i = 0; i < 20; i++)
        v[0][i] = 500000;
    citire();
    ofstream out("rmq.out");

    for (i = 0; i < k; i++){
        in >> c >> c2;
        l = log[c2 - c + 1];
        out << minim(v[c2][l], v[c + (1 << l) - 1][l]) << '\n';
        //out << i << '\n';
    }
    in.close();
    out.close();
    return 0;
}


void citire(){
    in >> n >> k;
    for (i = 1; i <= n; i++){
        in >> c;
        v[i][0] = c;
    }
    log[1] = 0;
    for (i = 2; i <= n; i++){
        if (i == (1 << (log[i - 1] + 1)))
            log[i] = 1 + log[i - 1];
        else
            log[i] = log[i - 1];
    }
    for (int j = 1; j <= n; j *= 2){
        for (i = 1; i <= n; i++){
            v[i][j] = minim(v[i][j - 1], v[maxim(i - (1 << j - 1), 0)][j - 1]);
        }
    }
}