Cod sursa(job #1974856)

Utilizator hanganflorinHangan Florin hanganflorin Data 29 aprilie 2017 02:04:43
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
using namespace std;

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

int n, m;
vector<int> v, rmq;
void Rmq(int nod, int st, int dr);
int Query(int nod, int st, int dr, int x, int y);

int main()
{
    is >> n >> m;
    v.push_back(0);
    for ( int i = 0, x; i < n; ++i )
    {
        is >> x;
        v.push_back(x);
    }
    rmq.resize(4*n+1);
    Rmq(1, 1, n);
    for ( int i = 0, x, y; i < m; ++i )
    {
        is >> x >> y;
        os << Query(1, 1, n, x, y) << "\n";
    }
    is.close();
    os.close();
    return 0;
}
void Rmq(int nod, int st, int dr)
{
    if ( st == dr )
    {
        rmq[nod] = v[st];
        return;
    }
    int m = (st+dr)/2;
    Rmq(nod*2, st, m);
    Rmq(nod*2+1, m+1, dr);
    rmq[nod] = min(rmq[nod*2], rmq[nod*2+1]);
}
int Query(int nod, int st, int dr, int x, int y)
{
    if ( x <= st && y >= dr )
        return rmq[nod];
    int v1 = -1, v2 = -1;
    int m = (st+dr)/2;
    if ( x <= m )
        v1 = Query(nod*2, st, m, x, y);
    if ( y > m )
        v2 = Query(nod*2+1, m+1, dr, x, y);
    if ( v1 == -1 )
        return v2;
    if ( v2 == -1 )
        return v1;
    return min(v1, v2);
}