Cod sursa(job #2273142)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 31 octombrie 2018 08:48:59
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX=2e5;

int A[NMAX], Arbore[5*NMAX], N, M, i, x, y, X;

void Update (int nod, int a, int b, int poz, int val)
{
    if(a==b)
    {
        Arbore[nod]=val;

        return;
    }

    int mij=(a+b)/2;

    if(poz<=mij)
        Update(2*nod, a, mij, poz, val);

    if(poz>mij)
        Update(2*nod+1, mij+1, b, poz, val);

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

int Query (int nod, int a, int b, int qa, int qb)
{
    if(qa<=a && b<=qb)
        return Arbore[nod];

    int mij=(a+b)/2;

    int ans1=INT_MAX, ans2=INT_MAX;

    if(qa<=mij)
        ans1=Query(2*nod, a, mij, qa, qb);

    if(qb>mij)
        ans2=Query(2*nod+1, mij+1, b, qa, qb);

    return min(ans1, ans2);
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    scanf("%d%d", &N, &M);

    for(i=1; i<=N; i++)
    {
        scanf("%d", &X);

        Update(1, 1, N, i, X);
    }

    for(i=1; i<=M; i++)
    {
        scanf("%d%d", &x, &y);

        printf("%d\n", Query(1, 1, N, x, y));
    }

    return 0;
}