Cod sursa(job #1204465)

Utilizator DenisacheDenis Ehorovici Denisache Data 2 iulie 2014 23:43:06
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 100005
int N,M,arbInt[MAX_N<<2],val,i,maxim,sum;
void Update(int nod,int left,int right,int poz,int val)
{
    if (left==right)
    {
        arbInt[nod]-=val;
        return;
    }
    int mid=(left+right)>>1;
    if (poz<=mid) Update(nod<<1,left,mid,poz,val);
    else Update((nod<<1)+1,mid+1,right,poz,val);
    arbInt[nod]=arbInt[nod<<1]+arbInt[(nod<<1)+1];
}
void Query(int nod,int left,int right,int start,int finish)
{
    if (start<=left && right<=finish)
    {
        sum+=arbInt[nod];
        return;
    }
    int mid=(left+right)>>1;
    if (start<=mid) Query(nod<<1,left,mid,start,finish);
    if (mid<finish) Query((nod<<1)+1,mid+1,right,start,finish);
}
int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d %d",&N,&M);
    for (i=1;i<=N;i++) scanf("%d",&val),Update(1,1,N,i,-val);
    while (M--)
    {
        int op,x,y;
        scanf("%d %d %d",&op,&x,&y);
        if (op) sum=0,Query(1,1,N,x,y),printf("%d\n",sum);
        else Update(1,1,N,x,y);
    }
    return 0;
}