Cod sursa(job #2464674)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 28 septembrie 2019 19:04:17
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 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);

    if(aint[nod].poz == payOff.poz || !aint[nod].poz)
    {
        aint[nod].val = payOff.val;
        aint[nod].poz = payOff.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 elem;

        elem.poz = i;
        elem.val = e;

        update(1, 1, MAX, elem);
    }

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

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

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

            fout << sol << '\n';
        }
        else
        {
            element elem;

            elem.poz = a;
            elem.val = b;

            update(1, 1, MAX, elem);
        }
    }

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

    return 0;
}