Cod sursa(job #891287)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 25 februarie 2013 15:22:35
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
#define nmax 15005
using namespace std;
int n,m,v[3*nmax],s,i,a,b,key,x;
void insert(int,int,int,int,int), sum(int,int,int,int,int);
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 ", &x);
         insert(1,1,n,i,-x);
     }
     for(;m;--m)
     {
         scanf("%d%d%d", &key, &a, &b);
         if(key==0)
            insert(1,1,n,a,b);
         else
         {
             s=0;
             sum(1,1,n,a,b);
             printf("%d\n", s);
         }
     }
    return 0;
}
void insert(int rad, int st, int dr, int poz, int val)
{
    int midd;
    if(st==dr)
    {
        v[rad]-=val;
        return;
    }
    midd=(st+dr)/2;
    if(poz<=midd)insert(2*rad,st,midd,poz,val);
    else insert(2*rad+1,midd+1,dr,poz,val);
    v[rad]=v[2*rad]+v[2*rad+1];
}
void sum(int rad, int st, int dr, int p, int q)
{
    int midd;
    if(p<=st&&dr<=q)
        s+=v[rad];
    else
    {
        midd=(st+dr)/2;
        if(p<=midd)sum(2*rad,st,midd,p,q);
        if(midd<q)sum(2*rad+1,midd+1,dr,p,q);
    }
}