Cod sursa(job #1347041)

Utilizator BologaDragosBologa Dragos BologaDragos Data 18 februarie 2015 19:20:08
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>

#define NMAX 15006

using namespace std ;

ifstream f("datorii.in") ;
ofstream g("datorii.out") ;

int SumaEle [4*NMAX +69] ;

int n,m,pos,val,suma ;

int a,b,start,finish ;


void Update(int nod,int left,int right)
{
    int mij ;
    if(left==right)
    {
        SumaEle[nod]-=val ;
        return ;
    }
    mij=(left+right)/2 ;
    if(pos<=mij)
        Update(2*nod,left,mij) ;
    else
        Update(2*nod+1,mij+1,right) ;

    SumaEle[nod]=SumaEle[2*nod] + SumaEle[2*nod+1] ;

}

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

    SumaEle[nod]=SumaEle[2*nod] + SumaEle[2*nod+1] ;

}


void Query(int nod,int left,int right)
{
    int mij ;
    if(start<=left&&right<=finish)
    {
        suma+=SumaEle[nod] ;
        return ;
    }
    mij=(left+right)/2 ;
    if(start<=mij)
        Query(2*nod,left,mij) ;
    if(mij<finish)
        Query(2*nod+1,mij+1,right) ;

}



int main()
{
    int x,cod ;
    f>>n>>m ;
    for(int i=1;i<=n;i++)
    {
        f>>x ;
        pos=i ;
        val=x ;
        Init(1,1,n) ;
    }

    for(int i=1;i<=m;i++)
    {
        f>>cod>>a>>b ;
        if(cod==0)
        {
            pos=a ;
            val=b ;
            Update(1,1,n) ;
        }

        else
        {
            start=a ;
            finish=b ;
            suma=0 ;
            Query(1,1,n) ;
            g<<suma<<'\n' ;

        }

    }

    return 0 ;



}