Cod sursa(job #2464683)

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

using namespace std;

struct element
{
    int poz;
    int val;
}aint[2 * MAX + 1];

void update(int nod, int st, int dr, element payOff)
{
    if(st == dr)
    {
        aint[nod].val = payOff.val;
        aint[nod].poz = payOff.poz;
        return;
    }

    int mij = (st + dr) / 2;

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

    int maxVal = max(aint[nod * 2].val, aint[nod * 2 + 1].val);

    if(maxVal == aint[nod * 2].val)
    {
        aint[nod].val = maxVal;
        aint[nod].poz = aint[nod * 2].poz;
    }
    else
    {
        aint[nod].val = maxVal;
        aint[nod].poz = aint[nod * 2 + 1].poz;
    }
}


void query(int nod, int st, int dr, int a, int b, int &sol)
{
    if(a <= st && dr <= b)
    {
        sol = max(sol, aint[nod].val);
        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;

        element payOff;

        payOff.poz = i;
        payOff.val = e;

        update(1, 1, n, payOff);
    }

    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
        {
            element payOff;

            payOff.poz = a;
            payOff.val = b;

            update(1, 1, n, payOff);
        }
    }

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

    return 0;
}