Cod sursa(job #1514659)

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

int v[100101][30];
int log[100100];
int i, k, j, n, c, c2, l, rez;

void citire();

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

int main(){
    for (i = 0; i <= 25; i++)
        v[0][i] = 500000;
    citire();
    ofstream out("rmq.out");
    /*for (int i = 0, j = 1; j <= n; i++, j *= 2){
        for (int q = 0; q <= n; q++)
            out << v[q][i] << ' ';
        out << endl;
    }*/
    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 i = 1; i <= n; i++){
        for (j = 1; 1 << j <= i; j++){
            v[i][j] = minim(v[i][j - 1], v[i - (1 << (j - 1))][j - 1]);
        }
    }
}