Cod sursa(job #2513813)

Utilizator patrickdanDan patrick patrickdan Data 23 decembrie 2019 20:12:53
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include<algorithm>

using namespace std;
int a[10005];
int t[40005];
void build(int v,int tl,int tr)
{
    if(tl==tr)
        t[v]=a[tl];
    else
    {
    int tm=(tl+tr)/2;
    build(2*v,tl,tm);
    build(2*v+1,tm+1,tr);
    t[v]=t[2*v]+t[2*v+1];
    }
}
int getsum(int v,int tl,int tr, int l ,int r)
{
    if(l>r)
    return 0;
    if(tl==l && tr==r)
        return t[v];
    else
    {
        int tm=(tl+tr)/2;
        return getsum(2*v,tl,tm,l,min(r,tm))+getsum(2*v+1,tm+1,tr,max(l,tm+1),r);
    }
}
void update (int v, int tl, int tr, int pos,int val)
{
    if(tl==tr)
        t[v]-=val;
    else
    {
        int tm=(tl+tr)/2;
        if(pos<=tm)
            update(2*v,tl,tm,pos,val);
        else
            update(2*v+1,tm+1,tr,pos,val);
        t[v]=t[2*v]+t[2*v+1];
    }
}
int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        scanf("%d%d%d",&t,&a,&b);
        if(t==0)
            update(1,1,n,a,b);
        else
            printf("%d\n",getsum(1,1,n,a,b));
    }
    return 0;
}