Cod sursa(job #2401387)

Utilizator Seba951Sebastian Boerescu Seba951 Data 9 aprilie 2019 17:44:07
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>

using namespace std;

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

const int N=1<<18;
int arb[N], a, b, poz, val;

int query(int p, int st, int dr)
{
    if(a<=st && dr<=b) return arb[p];
    int m=(st+dr)/2, m1=0, m2=0;
    if(a<=m) m1=query(2*p, st, m);
    if(b>m) m2=query(2*p+1, m+1, dr);
    return m1+m2;
}

void update1(int p, int st, int dr)
{
    if(st==dr)
    {
        arb[p]-=val;
        return;
    }
    int m=(st+dr)/2;
    if(poz<=m) update1(2*p, st, m);
    else update1(2*p+1, m+1, dr);
    arb[p]=arb[2*p]+arb[2*p+1];
}

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

int main()
{
    int n, m;
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        in>>val;
        poz=i;
        update(1, 1, n);
    }
    for(int i=1; i<=m; i++)
    {
        bool q;
        in>>q;
        if(q)
        {
            in>>a>>b;
            out<<query(1, 1, n)<<'\n';
        }
        else
        {
            in>>poz>>val;
            update1(1, 1, n);
        }
    }
    return 0;
}