Cod sursa(job #2939235)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 13 noiembrie 2022 12:32:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, q;
vector<int> A;

struct BinaryIndexedTree
{
    vector<int> bit;
    void init()
    {
        bit.assign(n + 1, 0);
        for (int i = 1; i <= n; i++)
        {
            add(i, A[i]);
        }
    }

    void add(int idx, int value)
    {
        while (idx <= n)
        {
            bit[idx] += value;
            idx += (idx & (-idx));
        }
    }

    int sum(int idx)
    {
        int total = 0;
        while (idx > 0)
        {
            total += bit[idx];
            idx -= (idx & (-idx));
        }
        return total;
    }

    int range_sum(int left, int right)
    {
        return sum(right) - sum(left - 1);
    }
} BIT;

int main()
{
    fin >> n >> q;
    A.assign(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        fin >> A[i];
    }
    BIT.init();
    for (int i = 1; i <= q; i++)
    {
        int tip;
        fin >> tip;
        if (tip == 0)
        {
            int idx, value;
            fin >> idx >> value;
            BIT.add(idx, -value);
        }
        else
        {
            int left, right;
            fin >> left >> right;
            fout << BIT.range_sum(left, right) << '\n';
        }
    }
    return 0;
}