Cod sursa(job #2880351)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 29 martie 2022 17:15:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define MAX 100005

using namespace std;

class ArboreDeIntervale
{
private:
    int *arb, SIZE;

private:
void functie(int nod, int x, int y)
{
    arb[nod] = max(arb[x], arb[y]);
}

int rezultat(int x, int y)
{
    return max(x, y);
}

void construieste(int nod, int st, int dr, int v[])
{
    int mij;

    if(st == dr) arb[nod] = v[st];
    else
    {
        mij = (st + dr) / 2;
        construieste(2 * nod, st, mij, v);
        construieste(2 * nod + 1, mij + 1, dr, v);
        functie(nod, 2 * nod, 2 * nod + 1);
    }
}

void SeteazaPozitie(int nod, int st, int dr, int poz, int val)
{
    int mij;

    if(st == dr) arb[nod] = val;
    else
    {
        mij = (st + dr) / 2;
        if(poz <= mij) SeteazaPozitie(2 * nod, st, mij, poz, val);
        else SeteazaPozitie(2 * nod + 1, mij + 1, dr, poz, val);
        functie(nod, 2 * nod, 2 * nod + 1);
    }
}

int Intreaba(int nod, int st, int dr, int x, int y)
{
    int mij;

    if(x <= st && y >= dr) return arb[nod];
    else
    {
        mij = (st + dr) / 2;
        if(x > mij) return Intreaba(2 * nod + 1, mij + 1, dr, x, y);
        else if(y <= mij) return Intreaba(2 * nod, st, mij, x, y);
        else return rezultat(Intreaba(2 * nod + 1, mij + 1, dr, x, y), Intreaba(2 * nod, st, mij, x, y));
    }
}

public:
    ArboreDeIntervale(int Dimensiune)
    {
        SIZE = 1 << int(log2(Dimensiune - 1) + 1);
        arb = (int*)(malloc((SIZE + 2) * sizeof(int)));
        for(int i = 0; i <= SIZE; i++) arb[i] = 0;
    }

    ArboreDeIntervale(int Dimensiune, int *Vector)
    {
        SIZE = Dimensiune;
        arb = (int*)(malloc((2 * (1 << int(log2(Dimensiune - 1) + 1)) + 2) * sizeof(int)));
        construieste(1, 1, SIZE, Vector);
    }

    void SetPoz(int poz, int val)
    {
        SeteazaPozitie(1, 1, SIZE, poz, val);
    }

    int GetRez(int st, int dr)
    {
        return Intreaba(1, 1, SIZE, st, dr);
    }
};

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int main()
{
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n, q, i, x, y, z, v[MAX];

    fin >> n >> q;
    for(i = 1; i <= n; i++) fin >> v[i];
    ArboreDeIntervale a(n, v);

    while(q--)
    {
        fin >> x >> y >> z;
        if(x == 0) fout << a.GetRez(y, z) << '\n';
        else a.SetPoz(y, z);
    }

    return 0;
}