Cod sursa(job #1773117)

Utilizator danielNiculaeDaniel Niculae danielNiculae Data 7 octombrie 2016 16:09:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include "algorithm"
#include "fstream"

using namespace std;

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

const int INF = 1000000005;
const int NMAX = 100005;
const int LOG_NMAX = 19;

int N, M;

int rmq[LOG_NMAX][NMAX];
int sp[NMAX];

//int extractMinimum(int x, int y, int i, int j) {
////    fout << "i: " << i << ", j: " << j << ", x: " << x << ", y: " << y << "\n";
//    if(x <= (j - 1)*(1<<i) + 1 && j*(1<<i) <= y) {
//        return rmq[i][j];
//    }
//
//    int left = INF, right = INF;
//    if(x <= (2*j-1)*(1<<(i - 1))) {
//        left = extractMinimum(x, y, i - 1, 2*j - 1);
//    }
//    if((2*j-1)*(1<<(i - 1)) + 1 <= y) {
//        right = extractMinimum(x, y, i - 1, 2*j);
//    }
//    return min(left, right);
//}

int main() {

    fin >> N >> M;
    int depth = 0;

//    int pow = 1;
//    sp[1] = 1;
//    for(int i = 2 ; i <= N ; i++) {
//        if(i == 2 *)
//    }

    for(int i = 0 ; i < LOG_NMAX ; i++) {
        for(int j = 1 ; j < NMAX ; j++) {
            rmq[i][j] = INF;
        }
    }


    for(int j = 1 ; j <= N ; j++) {
        fin >> rmq[0][j];
    }

    for(int i = 1 ; (1 << (i-1)) <= N ; i++) {
        depth++;
        for(int j = 1 ; j + (1<<(i-1)) <= N ; j++) {
//            printf("Computing rmq of i: %d, j: %d\n", i, j);
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1<<(i-1))]);
        }
    }

//    for(int i = 0 ; i <= 3 ; i++) {
//        for(int j = 1 ; j <= N ; j++) {
//            fout << rmq[i][j] << " ";
//        }
//        fout << "\n";
//    }
//    fout << "\n";
//    fout.flush();

    for(int t = 1 ; t <= M ; t++) {
        int x, y;
        fin >> x >> y;

        int k = 0;
        while(1 << (k + 1) <= (y - x + 1)) {
            k++;
        }
//        fout << "k is: " << k << "\n";
        fout << min(rmq[k][x], rmq[k][y - (1<<k) + 1]) << "\n";
    }
}