Cod sursa(job #2580189)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 13 martie 2020 13:24:16
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 15e3 + 1;

int N, M;
long long segment_tree[4*N_MAX + 1];

void update(int value, int index, int left = 1, int right = N, int node = 1)
{
    if(left == right)
    {
        segment_tree[node] += value;
        return;
    }

    int middle = (left + right) / 2;

    if(index <= middle)
    {
        update(value, index, left, middle, node * 2);
    }
    else
    {
        update(value, index, middle + 1, right, node * 2 + 1);
    }

    segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
}


long long query(int a, int b, int left = 1, int right = N, int node = 1)
{
    if(a <= left && right <= b)
    {
        return segment_tree[node];
    }

    int middle = (left + right) / 2;

    long long answer = 0;

    if(a <= middle)
    {
        answer += query(a, b, left, middle, node * 2);
    }

    if(b > middle)
    {
        answer += query(a, b, middle + 1, right, node * 2 + 1);
    }

    return answer;
}

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= N; ++i)
    {
        int value;
        fin >> value;

        update(value, i);
    }


    for(int i = 1; i <= M; ++i)
    {
        int code;
        fin >> code;

        if(code == 0)
        {
            int T, V;
            fin >> T >> V;

            update(-V, T);
        }

        if(code == 1)
        {
            int P, Q;
            fin >> P >> Q;

            fout << query(P, Q) << '\n';
        }
    }
}