Cod sursa(job #3258078)

Utilizator ShAwDoRneYNacu Gabriel ShAwDoRneY Data 20 noiembrie 2024 19:30:56
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>

using namespace std;

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

int offset = 1;

void segmentTreeInit(vector<int> &segmentTree, int noElements) {

    while(offset < noElements)
        offset*=2;
    
    segmentTree.resize(2*offset);

    for(int i=0; i<noElements; i++) {
        fin >> segmentTree[offset+i];
    }

    for(int i=offset-1; i>=1; i--)
        segmentTree[i] = segmentTree[2*i]+segmentTree[2*i+1];

}

void Update(int poz, int val, vector<int> &segmentTree) {

    int node = offset + poz - 1;
    segmentTree[node] -= val;
    node/=2;

    while(node) {
        segmentTree[node] = segmentTree[2*node] + segmentTree[2*node+1];
        node/=2;
    }
}

int Query(int node, int currentLeft, int currentRight, int targetLeft, int targetRight, vector<int> &segmentTree) {
    if(targetLeft <= currentLeft && currentRight <= targetRight)
        return segmentTree[node];
    
    int rez = 0;

    int mid = (currentLeft + currentRight) / 2;
    int node1 = node*2;
    int node2 = node*2+1;
    int node1Left = currentLeft;
    int node1Right = mid;
    int node2Left = mid+1;
    int node2Right = currentRight;

    if(node1Right >= targetLeft)
        rez += Query(node1, node1Left, node1Right, targetLeft, targetRight, segmentTree);
    
    if(node2Left <= targetRight)
        rez += Query(node2, node2Left, node2Right, targetLeft, targetRight, segmentTree);

    return rez;
}

int main() {

    int noElements, noQueries;
    vector<int> segmentTree;

    fin >> noElements >> noQueries;
    
    segmentTreeInit(segmentTree, noElements);

    while(noQueries--) {
        int operation, left, right;

        fin >> operation >> left >> right;

        if(operation == 0)
            Update(left, right, segmentTree);
        else
            fout << Query(1, 1, offset, left, right, segmentTree) << endl;
    }

}