Cod sursa(job #2613940)

Utilizator UtilizatorGBGeorge Bodea UtilizatorGB Data 10 mai 2020 21:15:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.68 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
using namespace std;

void crearea_arbore(int* arboric, vector<int> &v, int stanga, int dreapta, int poz){
    if(stanga == dreapta){
        arboric[poz]=v[stanga];
    }
    else{
        crearea_arbore(arboric, v, stanga, (stanga+dreapta)/2,2*poz); // 2*poz = fiul stang
        crearea_arbore(arboric, v, (stanga+dreapta)/2+1, dreapta,2*poz+1); // 2*poz+1 = fiul drept
        arboric[poz]=max(arboric[2*poz],arboric[2*poz+1]);
        //     1
        //   2   3
        // 4 5  6 7
        // Acesta e arborele de indici ale arborelui binar
    }
}

void maximul_a_b(int* arboric, vector<int> &v, int stanga, int dreapta, int poz, int stanga_curent, int dreapta_curent, int& maxim){
    if (stanga<=stanga_curent && dreapta>=dreapta_curent){
        maxim= max(maxim, arboric[poz]);
    }
    else{
        int mij=(stanga_curent+dreapta_curent)/2;
        if (mij>=stanga)
            maximul_a_b(arboric, v, stanga, dreapta, poz*2, stanga_curent, mij, maxim);
        if (mij<dreapta)
            maximul_a_b(arboric, v, stanga, dreapta, poz*2+1, mij+1, dreapta_curent, maxim);
    }
}

void schimbare_element(int* arboric, vector<int> &v, int stanga, int dreapta, int poz_curent, int de_actualizat, int poz_actualizare){
    if (stanga == dreapta){
        v[poz_actualizare]= de_actualizat;
        arboric[poz_curent]= de_actualizat;
    }
    else{
        int mij=(stanga+dreapta)/2;
        if (mij>=poz_actualizare){
            schimbare_element(arboric,v,stanga,mij,poz_curent*2, de_actualizat, poz_actualizare);
            arboric[poz_curent]=max(arboric[poz_curent*2],arboric[poz_curent*2+1]);
        }
        else{
            schimbare_element(arboric,v,mij+1,dreapta,poz_curent*2+1, de_actualizat, poz_actualizare);
            arboric[poz_curent]=max(arboric[poz_curent*2],arboric[poz_curent*2+1]);
        }
    }
}

int main() {
    ifstream f("arbint.in");
    int n,m,aux;
    f>>n>>m;
    vector<int> numere;
    for(int i=0; i<n;i++) {
        f >> aux;
        numere.push_back(aux);
    }

    int arbore[1<<(int)(log2(n)+2)];
    arbore[0]=-1;
    crearea_arbore( arbore, numere, 0, n-1 , 1);

    for(int a=0; a<1<<(int)(log2(n)+2);a++)
        cout<<arbore[a]<<' ';
    cout<<endl;

    ofstream g("arbint.out");
    int comanda, a,b;
    for(int i=0;i<m;i++){
        f>>comanda>>a>>b;
        if (comanda==0){
            a--;
            b--;
            int maxim = 0;
            maximul_a_b(arbore, numere, a, b,1, 0 , n-1, maxim);
            g<<maxim<<'\n';
        }
        else{
            a--;
            schimbare_element(arbore, numere,0, n-1, 1, b, a);
        }
    }

    f.close();
    g.close();
    return 0;
}