Cod sursa(job #2345949)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 16 februarie 2019 21:21:31
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

#define NMAX 100005
using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

int Arbore[4 * NMAX], minn;

void UpdateArb(int nod, int val, int st, int dr, int poz){
    if(st == dr){
        Arbore[nod] = val;
        return;
    }

    int mij = (st + dr) / 2;
    if(poz <= mij)
        UpdateArb(2* nod, val, st, mij, poz);
    else UpdateArb(2 * nod + 1, val, mij + 1, dr, poz);

    Arbore[nod] = min(Arbore[nod * 2], Arbore[nod * 2 + 1]);
}

void Query(int nod, int st, int dr, int stanga, int dreapta){
    if(stanga <= st && dr <= dreapta){
        if(Arbore[nod] < minn)
            minn = Arbore[nod];
        return;
    }

    int mij = (st + dr) / 2;
    if(stanga < mij)
        Query(2 * nod, st, mij, stanga, dreapta);
    if(mij < dreapta)
        Query(2 * nod + 1, mij + 1, dr, stanga, dreapta);
}

int main()
{
    int n, m;
    cin >> n >> m;

    for(int i = 1; i <= n; ++i){
        int x;
        cin >> x;

        UpdateArb(1, x, 1, n, i);
    }

    for(int i = 1; i <= m; ++i){
        int x, y;
        cin >> x >> y;

        minn = (1 << 30);
        Query(1, 1, n, x, y);
        cout << minn << '\n';
    }
    return 0;
}