Cod sursa(job #3134314)

Utilizator Farcasi_George_OctavianFarcasi George Octavian Farcasi_George_Octavian Data 28 mai 2023 21:06:21
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
//
// Created by Octavian Farcasi on 28.05.2023.
//
#include<iostream>
#include<fstream>

int maxim(int x, int y){
    if(x>y)
        return x;
    return y;
}

//int get_dimensiune(int numar){
//    return numar*2-1;
//}

void creare_arb(int valori[],int arb_int[], int low, int high, int poz){
    if(low==high){
        arb_int[poz]=valori[low];
        return;
    }
    int mijloc=(low+high)/2;
    creare_arb(valori,arb_int,low,mijloc,poz*2);
    creare_arb(valori,arb_int,mijloc+1,high,(poz*2)+1);
    arb_int[poz]= arb_int[poz*2]+arb_int[(poz*2)+1];
}

void actualizare(int arb_int[], int low, int high, int radacina,int pozitie, int valoare){
    if(low==high){
        arb_int[radacina]=valoare;
        return;
    }
    int mijloc = (low+high)/2;
    if (pozitie<=mijloc)                                                            //in functie de cum e pozitia fata de mijloc, mergem pe stanga sau pe dreapta
        actualizare(arb_int,low,mijloc,radacina*2,pozitie,valoare);
    else
        actualizare(arb_int,mijloc+1,high,(radacina*2)+1,pozitie,valoare);
    arb_int[radacina]= arb_int[radacina*2]+arb_int[(radacina*2)+1];
}

int afla_suma(int arb_int[],int low, int high, int x, int y, int radacina) {
    if(x<=low && high<=y)
        return arb_int[radacina];                                               //intervalul este complet inclus si nodul contine valoarea cautata
    int mijloc=(low + high)/2;
    int s_stanga =0, s_dreapta =0;
    if(mijloc>=x)                                                               //ne ducem pe stanga si cautam suma
        s_stanga = afla_suma(arb_int,low,mijloc, x, y,radacina*2);
    if(mijloc < y)                                                              //ne ducem pe dreapta si cautam suma
        s_dreapta = afla_suma(arb_int,mijloc+1,high, x, y,(radacina*2)+1);
    return s_stanga+s_dreapta;                                //aflam suma dintre cele doua
}


int main(){
    std::ifstream f("datorii.in");
    std::ofstream g("datorii.out");

    int n,m,operatie,a,b;
    f>>n>>m;
    int arb_int[4*100001], valori[100001];
    for(int i=1;i<=n;i++)
        f>>valori[i];
    for(int i=1;i<4*100001;i++)
        arb_int[i]=0;
    creare_arb(valori,arb_int,1,n,1);
    for(int i=1;i<=m;i++){
        f>>operatie>>a>>b;
        switch (operatie) {
            case 0:
                valori[a]-=b;
                actualizare(arb_int,1,n,1,a,valori[a]);
                break;
            case 1:
                g<<afla_suma(arb_int,1,n,a,b,1)<<"\n";
                break;
        }
    }
    f.close();
    g.close();
    return 0;
}