Cod sursa(job #2464688)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 28 septembrie 2019 19:32:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define MAX 100001

using namespace std;

int aint[MAX * 3];

void update(int nod, int st, int dr, int leaf, int payOff)
{
    if(st == dr)
    {
        aint[nod] = payOff;
        return;
    }

    int mij = (st + dr) / 2;

    if(leaf <= mij)update(nod * 2, st, mij, leaf, payOff);
    else update(nod * 2 + 1, mij + 1, dr, leaf, payOff);

    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}


void query(int nod, int st, int dr, int a, int b, int &sol)
{
    if(a <= st && dr <= b)
    {
        sol = max(sol, aint[nod]);
        return;
    }

    int mij = (st + dr) / 2;

    if(a <= mij)query(nod * 2, st, mij, a, b, sol);
    if(mij < b)query(nod * 2 + 1, mij + 1, dr, a, b, sol);
}

int main()
{
    int n, m, i, e, cer, a, b, sol;

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

    fin >> n >> m;

    for(i = 1; i <= n; i++)
    {
        fin >> e;

        update(1, 1, n, i, e);
    }

    for(i = 1; i <= m; i++)
    {
        fin >> cer >> a >> b;

        if(cer == 0)
        {
            sol = 0;

            query(1, 1, n, a, b, sol);

            fout << sol << '\n';
        }
        else
            update(1, 1, n, a, b);
    }

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

    return 0;
}