Cod sursa(job #3134359)

Utilizator andrei_l20031Legian Andrei andrei_l20031 Data 28 mai 2023 22:13:34
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

void create(int vals[], int intTree[], int l, int h, int cp){
    // low = l, h = high, cp = current position
    if (l == h){
        intTree[cp] = vals[l];
        return;
    }

    int mid = (l + h) / 2;

    create(vals, intTree, l, mid, cp * 2);
    create(vals, intTree, mid + 1, h, (cp * 2) + 1);

    intTree[cp]= intTree[cp * 2] + intTree[(cp * 2) + 1];
}

void update(int intTree[], int l, int h, int root, int p, int valoare){
    // low = l, h = high, p = position to be updated
    if (l == h){
        intTree[root] = valoare;
        return;
    }

    int mid = (l + h) / 2;

    // Parcurgem arborele pana la pozitia cautata
    if (p > mid){
        update(intTree, mid + 1, h, (root * 2) + 1, p, valoare);
    } else {
        update(intTree, l, mid, root * 2, p, valoare);
    }

    // Actualizam restul arborelui la intoarcere
    intTree[root]= intTree[root * 2] + intTree[(root * 2) + 1];
}

int getSum(int intTree[],int l, int h, int left, int right, int root) {
    // low = l, h = high, left = left margin, right = right margin
    if (left <= l && h <= right){
        return intTree[root];
    }

    int mid = (l + h) / 2, leftSum = 0, rightSum = 0;

    // Calculam suma pe subarborele stang
    if (mid >= left){
        leftSum = getSum(intTree, l, mid, left, right, root * 2);
    }

    // Calculam suma pe subarborele drept
    if (mid < right){
        rightSum = getSum(intTree, mid + 1, h, left, right, (root * 2) + 1);
    }

    return leftSum + rightSum;
}


int main(){
    int nrComenzi, nrOperatii, operatie;
    int intTree[400004], vals[100001];
    for (int i=1;i<400004;i++){
        intTree[i]=0;
    }

    in >> nrComenzi >> nrOperatii;
    for (int i = 1; i <= nrComenzi; i++){
        in >> vals[i];
    }
    create(vals, intTree, 1, nrComenzi, 1);

    for (int i = 1; i <= nrOperatii; i++){
        int par1, par2;
        in >> operatie >> par1 >> par2;

        if (operatie) {
            vals[par1] -= par2;
            update(intTree, 1, nrComenzi, 1, par1, vals[par1]);
        } else {
            out << getSum(intTree, 1, nrComenzi, par1, par2, 1) << endl;
        }
    }
    return 0;
}