Cod sursa(job #2406583)

Utilizator radumihaisirbuSirbu Radu-Mihai radumihaisirbu Data 15 aprilie 2019 21:49:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 1e5 + 5, inf = 1e9;

vector <int> v(nmax), arbint(5 * nmax);

int n, q, start, finish;

void build (int ls = 1, int ld = n, int pos = 1)
{
    int mij;

    if (ls == ld)
    {
        arbint[pos] = v[ls];
        return;
    }

    mij = (ls + ld) / 2;

    build(ls, mij, 2 * pos);
    build(mij + 1, ld, 2 * pos + 1);

    arbint[pos] = min(arbint[2*pos], arbint[2*pos+1]);
}

int query (int ls = 1, int ld = n, int pos = 1)
{
    int FIRST = inf, SECOND = inf, mij;

    if (ls >= start && ld <= finish)
    {
        return arbint[pos];
    }

    mij = (ls + ld) / 2;

    if (start <= mij) FIRST = query(ls, mij, 2*pos);
    if (mij < finish) SECOND = query(mij+1, ld, 2*pos+1);
    return min(FIRST, SECOND);
}

int main()
{
    fin >> n >> q;
    for (int i=1; i<=n; ++i) fin >> v[i];
    build();
    while (q--)
    {
        fin >> start >> finish;
        fout << query() << '\n';
    }
    return 0;
}