Cod sursa(job #2797036)

Utilizator roberttrutaTruta Robert roberttruta Data 9 noiembrie 2021 10:36:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>

using namespace std;

void construieste(int* v, int* aint, int s, int d, int nod)
{
    if(s == d)
    {
        aint[nod] = v[s];
        return ;
    }
    int mij = (s + d) / 2;
    construieste(v, aint, s, mij, nod * 2);
    construieste(v, aint, mij + 1, d, nod * 2 + 1);
    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

void modifica(int* aint, int s, int d, int nod, int pozitie, int valoare_noua)
{
    if(s == d)
    {
        aint[nod] = valoare_noua;
        return ;
    }
    int mij = (s + d) / 2;
    if(pozitie <= mij)
        modifica(aint, s, mij, nod * 2, pozitie, valoare_noua);
    else
        modifica(aint, mij + 1, d, nod * 2 + 1, pozitie, valoare_noua);
    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

void raspunde(int* aint, int s, int d, int nod, int* Max, int poz_s, int poz_d)
{
    if(poz_s <= s && poz_d >= d)
    {
        if(aint[nod] > *Max)
            *Max = aint[nod];
        return ;
    }
    int mij = (s + d) / 2;
    if(poz_s <= mij)
        raspunde(aint, s, mij, nod * 2, Max, poz_s, poz_d);
    if(poz_d > mij)
        raspunde(aint, mij + 1, d, nod * 2 + 1, Max, poz_s, poz_d);
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int i, n, nr_operatii, tip, a, b;
    f >> n >> nr_operatii;

    int* v=(int*)malloc(sizeof(int) * (n + 5));
    i=1;
    while(i < 2 * n)
        i = i << 1;
    int* aint=(int*)malloc(sizeof(int) * (i + 5));

    for(i = 1; i <= n; i++)
        f >> v[i];

    construieste(v, aint, 1, n, 1);
    free(v);

    for(i = 1; i <= nr_operatii; i++)
    {
        f >> tip >> a >> b;
        if(tip == 1)
            modifica(aint, 1, n, 1, a, b);
        else
        {
            int Max = 0;
            raspunde(aint, 1, n, 1, &Max, a, b);
            g << Max << '\n';
        }
    }
    free(aint);
    return 0;
}