Cod sursa(job #2754791)

Utilizator ChelaruPaulChelaru Paul ChelaruPaul Data 26 mai 2021 15:39:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include<fstream>
#include <iostream>

#define ll long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int fiuStanga(int nod) {
    return 2 * nod;
}

int fiuDreapta(int nod) {
    return 2 * nod + 1;
}

void updateTree(int tree[], int stanga, int dreapta, int poz, int val, int nodCurent) {
    if (stanga == dreapta) {
        tree[nodCurent] = val;
        return;
    }

    int mij = (stanga + dreapta) / 2;
    if (poz <= mij) updateTree(tree, stanga, mij, poz, val, fiuStanga(nodCurent));
    else updateTree(tree, mij + 1, dreapta, poz, val, fiuDreapta(nodCurent));

    tree[nodCurent] = max(tree[fiuStanga(nodCurent)], tree[fiuDreapta(nodCurent)]);
}


int query(int tree[], int nodCurent, int st, int dr, int stNOU, int drNOU) {
    //daca face overlap total returnez valoarea de pe nodul curent
    if (stNOU <= st && drNOU >= dr)
        return tree[nodCurent];

    int mij = st + (dr - st) / 2;

    //daca pozitia noua din stanga e mai mare decat mijlocul intervaluilui -> subtree dreapta
    //else subtree left
    if (stNOU > mij) return query(tree, fiuDreapta(nodCurent), mij + 1, dr, stNOU, drNOU);
    else if (drNOU <= mij) return query(tree, fiuStanga(nodCurent), st, mij, stNOU, drNOU);

    //max dintre fiu st si fiul dr
    return max(query(tree, fiuStanga(nodCurent), st, mij, stNOU, mij),
               query(tree, fiuDreapta(nodCurent), mij + 1, dr, mij + 1, drNOU));
}

int main() {

    int nrNumere, val, actiuni;
    fin >> nrNumere >> actiuni;
    int tree[4 * 100001];
    for (int i = 1; i <= nrNumere; i++) {
        fin >> val;
        updateTree(tree, 1, nrNumere, i, val, 1); //creez tree-ul pe valorile initiale
    }

    int actiune, poz, st, dr;
    for (int i = 0 ; i < actiuni ; i++)
    {
        fin >> actiune;
        if(actiune == 0){
            fin >> st >> dr;
            fout << query(tree, 1, 1, nrNumere, st, dr) << '\n';
        } else {
            fin >> poz >> val;
            updateTree(tree, 1, nrNumere, poz, val, 1);
        }
    }
    return 0;
}