Cod sursa(job #2671308)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 11 noiembrie 2020 21:40:06
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

const int NMAX = 100000;

int vec[1 + NMAX];
int aint[1 + 3 * NMAX];

void build(int index, int st, int dr)
{
    if (st == dr)
    {
        aint[index] = vec[st];
        return;
    }

    int mij = (st + dr) / 2;
    build(2 * index, st, mij);
    build(2 * index + 1, mij + 1, dr);

    if (aint[2 * index] < aint[2 * index + 1])
    {
        aint[index] = aint[2 * index];
    }
    else
    {
        aint[index] = aint[2 * index + 1];
    }
}

int query(int index, int stA, int drA, int stQ, int drQ)
{
    if (stA == stQ && drA == drQ)
    {
        return aint[index];
    }

    int mij = (stA + drA) / 2;

    if (drQ <= mij)
    {
        return query(2 * index, stA, mij, stQ, drQ);
    }
    else
    {
        if (stQ <= mij)
        {
            return min(query(2 * index, stA, mij, stQ, mij), query(2 * index + 1, mij + 1, drA, mij + 1, drQ));
        }
        else
        {
            return query(2 * index + 1, mij + 1, drA, stQ, drQ);
        }
    }
}

int main()
{
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    int n, m;

    in >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        in >> vec[i];
    }

    build(1, 1, n);

    for (int i = 1; i <= m; i++)
    {
        int st, dr;

        in >> st >> dr;

        out << query(1, 1, n, st, dr) << '\n';
    }

    return 0;
}