Cod sursa(job #2902849)

Utilizator alexdn6Dina Alexandru alexdn6 Data 16 mai 2022 21:03:31
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
vector <int > arb;
void Actualizare(int radacina, int stanga, int dreapta, int pozitie, int valoare)
{
    if(stanga == dreapta) {
        arb[radacina] = valoare;
        return;
    }
    int mijloc = (stanga + dreapta)/2;
    if(pozitie <= mijloc)
        Actualizare(2 * radacina, stanga, mijloc, pozitie, valoare);
    else
        Actualizare(2 * radacina + 1, mijloc + 1, dreapta, pozitie, valoare);
    arb[radacina] = min(arb[2 * radacina], arb[2 * radacina + 1]);
}

int Interogare(int radacina, int stanga, int dreapta, int x, int y)
{
    if(x <= stanga && dreapta <= y)
        return arb[radacina];
    int minim_stanga = 100000, minim_dreapta = 100000;
    int mijloc = (stanga + dreapta)/2;
    if(x <= mijloc)
        minim_stanga = Interogare(2 * radacina, stanga, mijloc, x, y);
    if(mijloc < y)
        minim_dreapta = Interogare(2 * radacina + 1, mijloc + 1, dreapta, x, y);
    return min(minim_stanga, minim_dreapta);
}

int main()
{int n, m, x, y, val, i;
    f>>n>>m;
    arb.resize(m * 4 + 1);
    for(i = 1; i <= n; i++)
    {
        f >> val;
        Actualizare(1, 1, n, i, val);
    }
    for(i = 1; i <= m; i++)
    {
        f >> x >> y;
        g << Interogare(1, 1, n, x, y) <<"\n";
    }
    return 0;
}