Cod sursa(job #2246428)

Utilizator ctrl_shift_nIncognito Man ctrl_shift_n Data 27 septembrie 2018 08:59:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

using namespace std;
const int NMAX=15005;
int aint[4*NMAX],v[NMAX];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=v[st];
        return ;
    }
    int mijl=(st+dr)/2;
    build(2*nod,st,mijl);
    build(2*nod+1,mijl+1,dr);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
void update(int nod,int st,int dr,int val,int x)
{
    if(st==dr)
    {
        aint[nod]-=val;
        return ;
    }
    int mijl=(st+dr)/2;
    if(x<=mijl)
        update(2*nod,st,mijl,val,x);
    else
        update(2*nod+1,mijl+1,dr,val,x);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
int query(int nod,int st,int dr,int x,int y)
{
    if(x==st and y==dr)
        return aint[nod];
    int mijl=(st+dr)/2;
    if(x>mijl)
        return query(2*nod+1,mijl+1,dr,x,y);
    if(y<=mijl)
        return query(2*nod,st,mijl,x,y);
    if(x<=mijl and y>mijl)
        return query(2*nod,st,mijl,x,mijl)+query(2*nod+1,mijl+1,dr,mijl+1,y);
}
int main()
{
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
    int n,m,a,b;
    bool to;
    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>>to>>a>>b;
        if(to==false)
            update(1,1,n,b,a);
        if(to==true)
            cout<<query(1,1,n,a,b)<<"\n";
    }
    return 0;
}