Cod sursa(job #2749686)

Utilizator faalaviaFlavia Podariu faalavia Data 7 mai 2021 18:39:24
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define NMAX 400005
#define MAXNUM 100001
int n, segTree[NMAX], input[MAXNUM];
void construct(int low, int high, int pos)
{
    if(low == high)
    {
        segTree[pos] = input[low];
        return;
    }
    int mid = (low+high)/2;
    construct(low, mid, 2*pos+1);
    construct(mid+1, high, 2*pos+2);
    segTree[pos] = min(segTree[2*pos+1], segTree[2*pos+2]);
}

int RMQ(int qlow, int qhigh, int low, int high, int pos)
{

    if(qlow <= low && qhigh>= high)  //intervalul cerut include intervalul actual
        return segTree[pos];

    if(qlow > high || qhigh < low)   //intervalele nu se suprapun
        return MAXNUM;
    int mid = (low +high)/2;
    return min(RMQ(qlow, qhigh, low, mid, pos*2+1),
                RMQ(qlow, qhigh, mid+1, high, pos*2+2));
}
int main()
{
    int m, val, a, b;
    fin >> n >> m;
    for(int i = 1;i <= n; ++i)
        fin >> input[i];
    construct(1,n,1);
    for(int i = 0 ; i < m; ++i)
    {
        fin >> a >> b;
        fout << RMQ(a, b, 1, n, 1)<<"\n";
    }

    return 0;
}