Cod sursa(job #3140876)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 10 iulie 2023 13:59:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#include <bits/stdc++.h>
#define nmax 15005
using namespace std;
int aintsum[4 * nmax + 55], n, q, op, x, y, v[nmax];
void build(int nod, int st, int dr)
{
    if(st == dr)
    {
        aintsum[nod] = v[st];
    }
    else
    {
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        aintsum[nod] = aintsum[2 * nod] + aintsum[2 * nod + 1];
    }
}
void update(int nod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aintsum[nod] -= val;
    }
    else
    {
        int mid = (st + dr) / 2;
        if(poz <= mid)
        {
            update(2 * nod, st, mid, poz, val);
        }
        else
        {
            update(2 * nod + 1, mid + 1, dr, poz, val);
        }
        aintsum[nod] = aintsum[2 * nod] + aintsum[2 * nod + 1];
    }
}
int query(int nod, int st, int dr, int poz, int val)
{
    if(poz <= st && dr <= val)
    {
        return aintsum[nod];
    }
    else
    {
        int mid = (st + dr) / 2;
        if(val <= mid)
        {
            return query(2 * nod, st, mid, poz, val);
        }
        if(poz > mid)
        {
            return query(2 * nod + 1, mid + 1, dr, poz, val);
        }
        return query(2 * nod, st, mid, poz, val) + query(2 * nod + 1, mid + 1, dr, poz, val);
    }
}
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int32_t main()
{
    ios_base::sync_with_stdio(0);
    fin.tie(0);
    fout.tie(0);
    fin >> n >> q;
    for(int i = 1; i <= n; ++i)
    {
        fin >> v[i];
    }
    build(1, 1, n);
    for(int i = 1; i <= q; ++i)
    {
        fin >> op >> x >> y;
        if(op == 0)
        {
            update(1, 1, n, x, y);
        }
        else
        {
            fout << query(1, 1, n, x, y) << '\n';
        }
    }
    return 0;
}