Cod sursa(job #2753941)

Utilizator DianaZaharia132nr2Zaharia Diana Cristiana DianaZaharia132nr2 Data 24 mai 2021 19:13:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int arb[400000], v[100000];

void  buildtree(int i, int L, int R)
{
    if (L == R) {
        arb[i] = v[R];
        return;
    }

    int aux = (L + R) / 2;
    buildtree (2*i+1, L, aux );
    buildtree (2*i+2, aux + 1, R );

    arb[i] = min( arb[2*i+1], arb[2 * i + 2] );
}

int querymin(int i, int L, int R, int x, int y)
{
    if (x <= L && y >= R)
        return arb[i];

    int aux = L + (R - L) / 2;

    if (x > aux)
        return querymin(2 * i + 2, aux + 1, R, x, y);
    else if (y <= aux)
        return querymin(2 * i + 1, L, aux, x, y);

    return min( querymin(2*i+1, L, aux, x, aux),  querymin(2*i+2, aux+1, R, aux+1, y) );
}

int main()
{
    int N, M, x, y;
    f >> N >> M;

    for (int i=1; i<=N;++i)
        f >> v[i];

    buildtree(1, 1, N);
    for (int i = 0; i < M;++i)
        {
            f >> x >> y;
            g << querymin(1, 1, N, x, y) << '\n';
        }

    return 0;
}