Cod sursa(job #2166961)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 13 martie 2018 19:37:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int nr, operatii, val, a, b, tip;

struct Nod
{
    Nod *st, *dr;
    int val;
    Nod()
    {
        st = NULL;
        dr = NULL;
        val = 0;
    }
};

void update(int poz, int val, int st, int dr, Nod *nod)
{
    if(st == dr)
    {
        nod->val = val;
        return;
    }
    if(nod->st == NULL)
    nod->st = new Nod;
    if(nod->dr == NULL)
    nod->dr = new Nod;

    int mijloc = (st+dr)/2;
    if(poz <= mijloc)
    update(poz, val, st, mijloc, nod->st);
    else
    update(poz, val, mijloc+1, dr, nod->dr);
    nod->val = max(nod->st->val, nod->dr->val);
}
int maxim(int ST, int DR, int st, int dr, Nod *nod)
{
    int raspuns=-10000000;
    if(ST <= st && st <= dr && dr <= DR)
    return nod->val;

    int mijloc = (st+dr)/2;

    if(ST <= mijloc)
    raspuns=max(raspuns,maxim(ST,DR,st,mijloc,nod->st));
    if(DR > mijloc)
    raspuns=max(raspuns,maxim(ST,DR,mijloc+1,dr,nod->dr));
    return raspuns;
}

int main()
{
    cin >> nr >> operatii;
    Nod *radacina;
    radacina = new Nod;
    for(int i=0; i < nr; i++)
    {
        cin >> val;
        update(i, val, 0, nr-1, radacina);
    }
    for(int i=1; i <= operatii; i++)
    {
        cin >> tip >> a >> b;
        if(tip == 1)
        {
            a--;
            update(a, b, 0, nr-1, radacina);
        }
        else
        {
            a--;
            b--;
            cout << maxim(a,b,0,nr-1,radacina) << '\n';
        }
    }
}