Cod sursa(job #3133124)

Utilizator alexandraisiAlexandra Diaconescu alexandraisi Data 25 mai 2023 10:00:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int n, m;
int a[1000000], st[100000000];
//arbori de intervale
void arbore(int p, int L, int R)  // constuieste arborele cu indexul curent p si indicii L si R care sunt nr din vector pe parcursul parcurgerii lui
{
    if (L == R)   //are un singur element =>
    {
        st[p] = a[L];
    }
    else // spargem intervalul in 2
    {  
        int mid = (L + R) / 2;
        arbore(2 * p, L, mid);
        arbore(2 * p + 1, mid + 1, R);
        st[p] = min(st[2 * p], st[2 * p + 1]); //luam minimul dintre minimele rezultate
    }
}

int query(int p, int L, int R, int i, int j) //query cu indexul curent p, L,R, si capetele intervalului i, j
{
    if (i > R || j < L) // daca nu e in interval
    {
        return 1000000; 
    }
    if (i <= L && j >= R)
    {
        return st[p]; // se returneaza val stocata inn st[p] adica min
    }
    int mid = (L + R) / 2;
    return min(query(2 * p, L, mid, i, j), query(2 * p + 1, mid + 1, R, i, j)); // minimul dintre rezultate
}

int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");

    fin >> n >> m;

    for (int i = 1; i <= n; ++i)
    {
        fin >> a[i];
    }

    arbore(1, 1, n);

    for (int i = 0; i < m; ++i)
    {
        int x, y;
        fin >> x >> y;

        int k = query(1, 1, n, x, y);
        fout << k << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}