Cod sursa(job #2609735)

Utilizator radubigColtos Radu radubig Data 3 mai 2020 12:55:42
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#define lim 15000

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");

int aint[4*lim+5];

void build(int* src, int nod, int st, int dr)
{
    if(st>dr) return;
    if(st==dr)
        aint[nod]=src[st];
    else
    {
        int mij = (st+dr)/2;
        build(src, 2*nod, st, mij);
        build(src, 2*nod+1, mij+1, dr);
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}

void update(int poz, int val, int nod, int st, int dr)
{
    if(st>dr || poz<st || poz>dr) return;
    if(st==dr)
        aint[nod] -= val;
    else
    {
        int mij = (st+dr)/2;
        update(poz, val, 2*nod, st, mij);
        update(poz, val, 2*nod+1, mij+1, dr);
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}

int query(int ql, int qr, int nod, int st, int dr)
{
    if(st>dr || qr<st || ql>dr) return 0;
    if(ql <= st && qr >= dr)
        return aint[nod];
    else
    {
        int mij = (st+dr)/2;
        int ansleft = query(ql, qr, 2*nod, st, mij);
        int ansright = query(ql, qr, 2*nod+1, mij+1, dr);
        return ansleft+ansright;
    }
}

int v[lim+5],n,m;

int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++) in>>v[i];

    build(v, 1, 1, n);

    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        in>>t>>a>>b;
        if(t==0)
            update(a,b,1,1,n);
        else
            out<<query(a,b,1,1,n)<<'\n';
    }

    return 0;
}