Cod sursa(job #2699527)

Utilizator Afanasiuc_DanielDaniel Afanasiuc Afanasiuc_Daniel Data 24 ianuarie 2021 19:59:27
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define dim (int)1e5 + 5
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int Arbore[4* dim];

void Update(int nod, int left, int right, int nr, int pozitie)
{
    if (left == right)
    {
        Arbore[nod] = nr;
        return;
    }
    int mid = (left + right) / 2;
    if (pozitie <= mid)
        Update(2 * nod, left, mid, nr, pozitie);
    else
        Update(2 * nod + 1, mid + 1, right, nr, pozitie);
    Arbore[nod] = min(Arbore[2 * nod], Arbore[2 * nod + 1]);
}
int Query(int nod, int start, int end, int l, int r)
{
    if (r<start || l>end)
        return 2147483647;
    if (l <= start && end <= r)
        return Arbore[nod];
    int mid = (start + end) / 2;
    int p1 = Query(2 * nod, start, mid, l, r);
    int p2 = Query(2 * nod + 1, mid + 1, end, l, r);
    return min(p1, p2);
}
int main() 
{
    int M, N;
    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        int x;
        fin >> x;
        Update(1, 1, N, x, i);
    }
    for (int i = 1; i <= M; ++i)
    {
        int a, b;
        fin >> a >> b;
        fout<<Query(1, 1, N, a, b)<<'\n';
    }
}