Cod sursa(job #1097006)

Utilizator Alex_Merceraaaaaaa Alex_Mercer Data 2 februarie 2014 20:31:15
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> a;
int m,n,x,y,q,i;

void adaug (int nod, int st, int dr, int pz, int val)
{
    if (st == dr) a.at(nod) += val;
    else
    {
        int m;
        m = (st + dr)/2;

        if (pz<=m) adaug (2*nod,st,m,pz,val);
            else adaug (2*nod+1,m+1,dr,pz,val);

        a.at(nod) = a.at(2*nod) + a.at(2*nod+1);
    }
}

int raspunde (int nod, int st, int dr, int lim_inf, int lim_sup)
{
    if (lim_inf<=st && lim_sup>=dr) return a.at(nod);
    else
    {
        int m,p1,p2;
        p1=p2=0;
        m = (st+dr)/2;
        if (lim_inf <=m) p1 = raspunde(2*nod,st,m,lim_inf,lim_sup);
        if (lim_sup >m) p2 = raspunde(2*nod+1,m+1,dr,lim_inf,lim_sup);
        return (p1+p2);
    }
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    scanf ("%d %d",&n,&m);
    a.resize(4*n+2,0);

    for (i=1; i<=n; i++)
    {
        scanf ("%d",&x);
        adaug (1,1,n,i,x);
    }
    for (i=1; i<=m; i++)
    {
        scanf ("%d %d %d",&q,&x,&y);
        if (!q) adaug(1,1,n,x,-y);
        else printf ("%d\n",raspunde(1,1,n,x,y));
    }
    return 0;
}