Cod sursa(job #1820413)

Utilizator UrsuDanUrsu Dan UrsuDan Data 1 decembrie 2016 18:07:02
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <iostream>

using namespace std;

int v[15050];
int arbint[60050];
int x,y;

int build(int node,int left,int right)
{
    int mid;
    if(left==right)
        arbint[node]=v[left];
    else
    {
        mid=(left+right)/2;
        arbint[node]=build(2*node,left,mid)+build(2*node+1,mid+1,right);
    }
    return arbint[node];
}

void update(int node,int left,int right)
{
    int mid;
    arbint[node]-=y;
    if(left==right)
        return;
    else
    {
        mid=(left+right)/2;
        if(x<=mid)
            update(2*node,left,mid);
        else
            update(2*node+1,mid+1,right);
    }
}

int query(int node,int left,int right)
{
    int mid,answer=0;
    if(x<=left && right<=y)
        answer=arbint[node];
    else
    {
        mid=(left+right)/2;
        if(x<=mid)
           answer+=query(2*node,left,mid);
        if(y>=mid+1)
           answer+=query(2*node+1,mid+1,right);
    }
    return answer;
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int m,n,i,p;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&p,&x,&y);
        if(p==0)
            update(1,1,n);
        else
           printf("%d\n",query(1,1,n));
    }
    return 0;
}