Cod sursa(job #2488045)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 6 noiembrie 2019 00:48:50
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <bits/stdc++.h>

#define in_file "datorii.in"
#define out_file "datorii.out"

using namespace std;

void printVec(vector<int> v)
{
    for(auto e : v)
    {
        fprintf(stdout, "%d, ", e);
    }
}

vector<int> segmentTree(1<<14+1, 0);

int getSegTreeSize(int n){
    int s=1;
    while(s<n) s*=2;
    return s;
}

void updateTree(int idx, int val){
    segmentTree[idx] -= val;
    idx /=2;
    while(idx>0){
        segmentTree[idx] = segmentTree[2*idx] + segmentTree[2*idx+1];
        idx /=2;
    }
}
int sum = 0;
void queryTree(int qLeft, int qRight, int idx, int tLeft, int tRight){
    if(qLeft <= tLeft && tRight <= qRight){
        sum+=segmentTree[idx];
        return;
    }
    int middle = (tLeft+tRight)/2;
    if(qLeft <= middle)
        queryTree(qLeft, qRight, 2*idx, tLeft, middle);
    if(qRight>middle)
        queryTree(qLeft, qRight, 2*idx+1, middle+1, tRight);
}
int main()
{
    freopen(in_file, "r", stdin);
    freopen(out_file, "w", stdout);

    int n, m;
    int aux;
    scanf("%d%d", &n, &m);

    int tSize = getSegTreeSize(n);

    for(int i=0; i<n; i++){
        scanf("%d", &aux);
        segmentTree[tSize+i] = aux;
    }

    for(int t=tSize-1; t>0; t--){
        segmentTree[t] = segmentTree[2*t] + segmentTree[2*t+1];
    }

    int qType, p1, p2;
    while(m--){
        scanf("%d%d%d", &qType, &p1, &p2);
        if(qType){
            sum=0;
            queryTree(p1, p2, 1, 1, tSize);
            printf("%d\n", sum);
        }
        else{
            updateTree(tSize+p1-1, p2);
        }
    }
    return 0;
}