Cod sursa(job #1935242)

Utilizator LazarAndreiLazar Andrei Teodor LazarAndrei Data 22 martie 2017 09:04:10
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
using namespace std;

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


const int MAX = 100001;
int N, M, X, Pos, segTree[400070], leftQ, rightQ;


void constructTree (int left, int right, int position) {
    if (left == right) {
        segTree[position] = X;
        return;
    }
    int mid = (left + right)/2;
    if (Pos <= mid)constructTree (left, mid, 2*position);
    else constructTree (mid+1, right, 2*position+1);

    segTree[position] = min (segTree[2*position], segTree[2*position+1]);
}


int Query (int left, int right, int position) {
    if (leftQ <= left && rightQ >= right){  ///Total Overlap
            return segTree[position];
    }

    if (leftQ > right || rightQ < left)/// No Overlap
        return MAX;
    int mid = (left + right)/2;
    return min (Query (left, mid, 2*position), Query (mid+1, right, 2*position+1) );
}

int main()
{
    in >> N >> M;

    for (int i = 1; i <= N; ++ i) {
        in >> X;
        Pos = i;
        constructTree (1, N, 1);
    }

    for (int i = 1; i <= M; ++ i) {
        in >> leftQ >> rightQ;

        out << Query (1, N, 1) <<'\n';
    }

    return 0;
}