Cod sursa(job #1314556)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:15:11
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<cmath>
#define INF 100005
using namespace std;

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

vector<int> A;
int n, Q, l, r;

vector<int> TREE;

void read() {
    fin>>n>>Q;
    int elem;
    A.push_back(0);
    TREE.resize(17*n, 0);
    for(int i=1; i<=n; i++) {
        fin>>elem;
        A.push_back(elem);
    }
}


void buildTree(int node, int cs, int cd) {
    //cout<<"Am apelat buildTree("<<node<<", "<<cs<<", "<<cd<<").\n";
    if(cs == cd) {
        TREE[node] = A[cs];
        return;
    }

    buildTree(node * 2, cs, (cs + cd)/2);
    buildTree(node * 2 + 1, (cs + cd)/2 + 1, cd);

    TREE[node] = min(TREE[node*2], TREE[node*2+1]);
}

int rmq (int &left, int &right, int node, int cs, int cd) {
    if(cs > right || cd < left) return INF;
    if(cs >= left && cd <= right) return TREE[node];
    else
    return min(
               rmq(left, right, node*2, cs, (cs+cd)/2),
               rmq(left, right, node*2+1, (cs+cd)/2+1, cd)
        );
}

int main() {
    read();
    buildTree(1, 1, n);
    //afisVect(TREE);
    for(int i=0; i<Q; i++) {
        fin>>l>>r;
        fout<<rmq(l, r, 1, 1, n)<<'\n';
    }
    return 0;
}