Cod sursa(job #1693342)

Utilizator AlexVolatiluVoicu Alex AlexVolatilu Data 22 aprilie 2016 22:08:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>

using namespace std;

int t[32768];

void Facerea(int n, int st, int dr, int poz, int val)
{
    if(st==dr) {t[n]=val;return;}
    int m=(st+dr)>>1;
    if(poz<=m) Facerea(2*n,st,m,poz,val);
    else Facerea(2*n+1,m+1,dr,poz,val);
    t[n]=t[2*n]+t[2*n+1];
}

void update(int n, int st, int dr, int poz, int val)
{
    if(st==dr) {t[n]-=val;return;}
    int m=(st+dr)>>1;
    if(poz<=m) update(2*n,st,m,poz,val);
    else update(2*n+1,m+1,dr,poz,val);
    t[n]=t[2*n]+t[2*n+1];
}

int query(int n, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b) return t[n];
    int m=(st+dr)>>1,r1=0,r2=0;
    if(a<=m) r1=query(2*n,st,m,a,b);
    if(b>m) r2=query(2*n+1,m+1,dr,a,b);
    return r1+r2;
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int n,m,i,j,p,q,tip;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&j);
        Facerea(1,1,n,i,j);
    }

    for(i=0;i<m;i++)
    {
        scanf("%d%d%d",&tip,&p,&q);
        if(tip==0)
            update(1,1,n,p,q);
        else printf("%d\n",query(1,1,n,p,q));
    }

    return 0;
}