Cod sursa(job #2010512)

Utilizator seby0007Pop Sebastian seby0007 Data 13 august 2017 13:46:11
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

#define oo 0x3f3f3f
using namespace std;

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

vector<int>segTree;
int N, M;

void buildSegTree(int root, int left, int right)
{
    if (left == right)
    {
        fin >> segTree[root];
        return;
    }
    int mid = (left + right) >> 1;

    buildSegTree(root << 1, left, mid);
    buildSegTree( (root << 1) | 1, mid + 1, right);

    segTree[root] = min(segTree[root << 1], segTree[ (root << 1) | 1]);

}

int query(int root, int left, int right, int _left, int _right)
{
    if (left >= _left && right <= _right)
        return segTree[root];

    if (left > _right || right < _left)
        return oo;

    int mid = (left + right) >> 1;

    return min( query(root << 1, left, mid, _left, _right),
    query( (root << 1) | 1, mid + 1, right, _left, _right ) );

}

int main()
{
    fin >> N >> M;
    segTree.resize(N << 2, 0);

    buildSegTree(1, 1, N);

    for(int x, y; M; --M)
    {
        fin >> x >> y;
        fout << query(1, 1, N, x, y) << "\n";
    }

    return 0;
}