Cod sursa(job #2480151)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 24 octombrie 2019 23:26:13
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax=15005;

int v[nmax],arb[4*nmax],rasp;

void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        arb[nod]=v[st];
        return ;
    }
    int mijl=(st+dr)/2;
    build(2*nod,st,mijl);
    build(2*nod+1,mijl+1,dr);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void update(int nod, int st, int dr, int x, int y)
{
    if(st==dr)
    {
        arb[nod]-=y;
        return;
    }
    int mijl=(st+dr)/2;
    if(x<=mijl)
        update(2*nod,st,mijl,x,y);
    else
        update(2*nod+1,mijl+1,dr,x,y);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}

void query(int nod, int st, int dr, int x, int y)
{
    if(st>=x&&dr<=y)
    {
        rasp+=arb[nod];
        return ;
    }
    int mijl=(st+dr)/2;
    if(x<=mijl)
        query(2*nod,st,mijl,x,y);
    if(mijl+1<= y)
        query(2*nod+1,mijl+1,dr,x,y);
}

int main()
{
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
    int n,m,x,y,q;
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>v[i];
    build(1,1,n);
    for(int i=1; i<=m; i++)
    {
        cin>>q>>x>>y;
        if(q==0)
            update(1,1,n,x,y);
        else
        {
            rasp=0;
            query(1,1,n,x,y);
            cout<<rasp<<"\n";
        }
    }
    return 0;
}