Cod sursa(job #2902880)

Utilizator iulia.talpalariuIulia-Georgiana Talpalariu iulia.talpalariu Data 16 mai 2022 21:19:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <fstream>

int arb[400001], n, m;



void pune_val(int nod, int st, int dr, int pozitie, int val) {
    if(st == pozitie && st == dr) { // cand ajung pe frunza pun val
        arb[nod] = val;
        return;

    }
    int mijloc_interval = (st+dr) >> 1;
    if (pozitie <= mijloc_interval) {
        pune_val(nod << 1, st, mijloc_interval,pozitie,val); // merg pe intervalul din st == pe fiul st in arbore care se afla la nod//2
    }
    else {
        pune_val((nod << 1)+1, mijloc_interval+1, dr, pozitie, val); // merg pe intervalul din dr == pe fiul dr in arbore care se afla la nod//2 + 1
    }

    arb[nod] = (arb[nod << 1] > arb[(nod << 1) + 1]) ? arb[nod << 1] : arb [(nod << 1) +1];


}
int max_interval(int nod, int st, int dr, int inceput, int sfarsit) {
    if(inceput <= st && sfarsit >= dr) { //daca intervalul meu include complet un interval din arbore
        return arb[nod]; // super returnez max pe interval deja calculat
    }
    else {
        int mijloc_interval = (st+dr) >> 1 ;
        int fiu_st = -100, fiu_dr= -100;
        if (inceput <= mijloc_interval) { // daca tb sa merg pe fiul st
            fiu_st = max_interval(nod << 1, st,mijloc_interval,inceput,sfarsit);
        }
        if (sfarsit > mijloc_interval) { // daca tb sa merg si pe fiul dr
            fiu_dr = max_interval((nod << 1)+1, mijloc_interval+1, dr, inceput, sfarsit);
        }
        return (fiu_dr > fiu_st) ? fiu_dr : fiu_st;

    }
}

int main()
{
    std::fstream fileIn("arbint.in");
    std::ofstream fileOut("arbint.out");

    fileIn >> n >> m;
    int x;
    for(int i = 1; i <= n; ++i) {
        fileIn >> x;
        pune_val(1,1,n,i,x); // pune valoarea x pe pozitia i = acum construiesc arborele si updatez max de intervale
    }
    int op, a,b;
    for( int i = 0; i < m; ++i) {
        fileIn >> op >> a >> b;

        if(op) {
            // pune b pe poz a -- schimb val si updatez max de intervale de mai sus
            pune_val(1,1,n,a,b);
        }
        else {
            //max din interval a,b
            fileOut << max_interval(1,1,n,a,b) << '\n';
        }
    }


    return 0;
}