Cod sursa(job #2907130)

Utilizator CristianCazacuCazacu Cristian - Gabriel CristianCazacu Data 28 mai 2022 21:00:15
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

int vec[4000001];
void arbore (int nod, int l, int r, int poz, int x )
{

    if(l == r)
    {
        vec[nod]=x;
        return;
    }
    int m =(l+r)>>1;

    if (poz <= m)
        arbore(2*nod, l, m, poz, x);
    else
        arbore (2*nod+1, m+1, r, poz, x);

    vec[nod] = std::min(vec[2*nod], vec[2*nod+1]);
}
int min(int nod, int left, int right, int stanga, int dreapta)
{
    if( left >= stanga && right <= dreapta) return vec[nod];

    int m=(left + right )/2;
    int nr1=100001, nr2= 100001;

    if (stanga <= m)
        nr1=min(2*nod, left , m, stanga, dreapta);

    if (m+1 <= dreapta)
        nr2=min(2*nod+1, m+1, right, stanga, dreapta);

    if(nr1 <= nr2)
        return nr1;

    return nr2;
}


int main()
{
    int n, m;
    std::ifstream f("rmq.in");
    std::ofstream g("rmq.out");

    f>>n>>m;

    for( int i=1; i<=n; i++)
    {
        int a;
        f>>a;
        arbore(1, 1, n, i, a);
    }

    for ( int i=1; i<=m; i++)
    {
        int a, b;
        f>>a>>b;
        g<<min(1, 1, n, a, b)<<"\n";

    }
    return 0;
}