Cod sursa(job #291326)

Utilizator razvan_emPrecupas Razvan razvan_em Data 29 martie 2009 17:50:31
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
using namespace std;
ofstream ofis("datorii.out");
ifstream ifis("datorii.in");
#define mmax 10001
long n,m,i,x,t,v,p,q,start,finish,sum,val,pos,arb[2*mmax+66],a[16000];
void update(int,int,int);
void query(int,int,int);

int main()
{
    ifis>>n>>m;
    for (i=1; i<=n; i++)
    {ifis>>x; a[i]=x; val=x; pos=i; update(1,1,n);}
    for (i=1; i<=m; i++)
    {
        ifis>>x;
        if(x==0)
        {ifis>>q>>p; a[q]-=p; val=a[q]; pos=q; update(1,1,n);}
        else 
        {
             ifis>>t>>v;
             sum=0; start=t; finish=v; 
             query(1,1,n); ofis<<sum<<"\n";}
    }
    
    return 0;
}

void update (int nod, int left, int right)
{
     if (left==right)
     { arb[nod]=val; return;}
     int div=(left+right)/2;
     if (pos<=div) update(2*nod,left,div);
     else update(2*nod+1,div+1,right);
     arb[nod]=arb[2*nod]+arb[2*nod+1];
}

void query(int nod, int left, int right)
{
     if (start<=left && finish>=right)
     {sum+=arb[nod]; return;}
     int div=(left+right)/2;
     if (start<=div) query(2*nod,left,div);
     if (div<finish) query(2*nod+1,div+1,right);
}