Cod sursa(job #2985701)

Utilizator alexgroparuObada Alex alexgroparu Data 26 februarie 2023 20:55:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <vector>
using namespace std;

using VI = vector<int>;

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

int n, Q;
VI arb;

void CitireDate();
void Arbint();
void Build(int x, int st, int dr);
void Update(int x, int st, int dr, int poz, int val);
int Query(int x, int st, int dr, int a, int b);

int main()
{
    CitireDate();
    Arbint();
    return 0;
}

void Arbint()
{
    int op, a, b;
    while(Q--)
    {
        fin >> op >> a >> b;
        if (op == 0)
            fout << Query(1, 1, n, a, b) << '\n';
        if (op == 1)
            Update(1, 1, n, a, b);
    }
}

void Update(int x, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        arb[x] = val;
        return;
    }
    
    int mij = (st + dr) / 2;

    if(poz <= mij)
        Update(2 * x, st, mij, 
               poz, val);
    else
        Update(2 * x + 1, mij + 1, dr,
               poz, val);

    arb[x] = max(arb[2 * x],
                 arb[2 * x + 1]);
}

int Query(int x, int st, int dr, int a, int b)
{
    if(st >= a && dr <= b)
        return arb[x];

    int mx {0}, mij = (st + dr) / 2;

    if (a <= mij)
        mx = Query(2 * x, st, mij,
                   a, b);
    
    if (b > mij)
        mx = max(mx, // maximul curent
                 Query(2 * x + 1, 
                         mij + 1, dr,
                         a, b));

    return mx;
}

void Build(int x, int st, int dr)
{
    if(st == dr)
    {
        fin >> arb[x];
        return;
    }

    int mij = (st + dr) / 2;

    Build(2 * x, st, mij);
    Build(2 * x + 1, mij + 1, dr);
    
    arb[x] = max(arb[2 * x],
                 arb[2 * x + 1]);
}

void CitireDate()
{
    fin >> n >> Q;
    arb = VI(4 * n + 1);
    Build(1, 1, n);
}