Cod sursa(job #2617018)

Utilizator pascustefanPascu Stefan Liviu pascustefan Data 20 mai 2020 16:40:23
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <fstream>
#include <assert.h>
using namespace std;
int n, m, MinArb[4*100001+66], start, finish, Val, Pos, minim;

void Update(int nod, int left, int right) {
    if (left == right) {
        MinArb[nod] = Val;
        return;
    }
    int div = (left + right) / 2;
    if (Pos <= div)
        Update(2 * nod, left, div);
    else
        Update(2 * nod + 1, div + 1, right);

    if(MinArb[2 * nod] < MinArb[2 * nod + 1])
        MinArb[nod] = MinArb[2 * nod];
    else MinArb[nod] = MinArb[2 * nod + 1];
}

void Query(int nod, int left, int right) {
    if (start <= left && right <= finish) {
        if (minim > MinArb[nod])
            minim = MinArb[nod];
        return;
    }

    int div = (left + right) / 2;
    if ( start <= div )
        Query(2 * nod, left, div);
    if ( div < finish )
        Query(2 * nod + 1, div + 1, right);
}

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

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &x);
        Pos = i, Val = x;
        Update(1, 1, n);
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &a, &b);
        minim = 100001;
        start = a, finish = b;
        Query(1,1,n);
        printf("%d\n", minim);
    }
    return 0;
}