Cod sursa(job #1778087)

Utilizator denniscrevusDennis Curti denniscrevus Data 13 octombrie 2016 14:00:53
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#define NMAX 15005
using namespace std;

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

int arb[100000], n, m, i, b, caz, a, v[NMAX];

void update(const int &st, const int &dr, const int &poz, const int &nod, const int &val)
{
    if(st==dr)
    {
        arb[nod] = val;
        return;
    }

    int mid = (st+dr)/2;

    if(mid>=poz)
        update(st,mid,poz,(nod<<1),val);
    if(mid<poz)
        update(st,mid,poz,(nod<<1)+1,val);

    arb[nod] = arb[(nod<<1)+1] + arb[(nod<<1)];
}

int querry(const int &st1, const int &dr1, const int &st2, const int &dr2, const int &nod)
{
    if(st1 == st2 && dr1 == dr2)
        return arb[nod];

    int mid = (st1+dr1)/2;

    if(mid>=dr2)
        return querry(st1, mid, st2, dr2, (nod<<1));
    if(mid<st2)
        return querry(mid+1, dr1, st2, dr2, (nod<<1)+1);

    return (querry(st1,mid,st2,mid,(nod<<1)) + querry(mid+1, dr1, mid+1, dr2, (nod<<1)+1));
}

int main()
{
    f>>n>>m;

    for(i=1;i<=n;i++)
    {
        f>>v[i];
        update(1,n,i,1,v[i]);
    }
    //for(i=1;i<=50;i++)
        //g<<arb[i]<<" ";
    for(i=1;i<=m;i++)
        {
            f>>caz;
            f>>a>>b;

            if(!caz)
            {
                v[a]-=b;
                update(1,n,a,1,v[a]);
            }
            else
                g<<querry(1,n,a,b,1)<<"\n";
        }
}