Cod sursa(job #2901842)

Utilizator Stefan_GhinescuGhinescu Stefan-George Stefan_Ghinescu Data 14 mai 2022 16:22:29
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define notlocal 1

#if !notlocal

#include <iostream>

#define std::cin fin
#define std::cout fout

#else

#include <fstream>

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

#endif

using namespace std;

const int NMAX = 15e3;

int arbint[5 * NMAX + 5];

void update(int target, int val, int st, int dr, int poz)
{
    int mid = (st + dr) / 2;
    arbint[poz] += val;
    if (st == dr)
    {
        return;
    }
    if (target <= mid)
    {
        update(target, val, st, mid, poz * 2);
    }
    else
    {
        update(target, val, mid + 1, dr, poz * 2 + 1);
    }
}

int query(int target_st, int target_dr, int st, int dr, int poz)
{
    int s = 0;
    int mid = (st + dr) / 2;
    if (st >= target_st && dr <= target_dr)
    {
        return arbint[poz];
    }
    if (target_st <= mid)
    {
        s += query(target_st, target_dr, st, mid, poz * 2);
    }
    if (target_dr > mid)
    {
        s += query(target_st, target_dr, mid + 1, dr, poz * 2 + 1);
    }
    return s;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m;
    fin >> n >> m;
    int x;
    for (int i = 1; i <= n; ++i)
    {
        fin >> x;
        update(i, x, 1, n, 1);
    }
    int y, z;
    while (m--)
    {
        fin >> x >> y >> z;
        if (!x)
        {
            update(y, -z, 1, n, 1);
        }
        else
        {
            fout << query(y, z, 1, n, 1) << '\n';
        }
    }
    return 0;
}