Cod sursa(job #2000688)

Utilizator BeFeSeuDaniel Dani Danutu BeFeSeu Data 14 iulie 2017 13:54:08
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
const int Nmax = 15010 * 4;
int a[Nmax];
int n, m, ans;
void upd(int nod, int left, int right, int poz, int x)
{
    int mid = left + (right - left)/ 2;

    if(left == right)
    {
        if(a[nod] != 0)a[nod] -= x;
        else a[nod] = x;
        return;
    }
    else if(poz <= mid)upd(2 * nod, left , mid, poz, x);
    else upd(2 * nod + 1, mid + 1, right, poz, x);
    a[nod] = a[2 * nod] + a[2 * nod + 1];
}
void query(int nod, int left, int right, int L, int R)
{
    int mid = left + (right - left)/2 ;

    if(L <= left && right <= R)
    {
        ans += a[nod];
        return;
    }
    if(left > R || right < L)
        return;
    query(2 * nod, left, mid ,L , R);
    query(2 * nod + 1, mid + 1, right, L ,R);
}
int main()
{
    fin >> n >> m;
    for(int i = 1,x ; i <= n; ++i)
    {
        fin >> x;
        upd(1 , 1, n , i , x);
    }
    for(int i = 1, q, x, y; i <= m; ++i)
    {
        fin >> q >> x >> y;
        if(q == 0)
            upd(1, 1 , n, x , y);
        else
        {
            ans = 0;
            query(1, 1 , n , x , y);
            fout << ans << '\n';
        }
    }
    return 0;
}