Cod sursa(job #2108392)

Utilizator SmitOanea Smit Andrei Smit Data 18 ianuarie 2018 10:16:58
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
using namespace std;

int n,m,r;
int arb[450003],t[15003];

/*void Citire()
{

}*/

int Adauga(int nod,int st,int dr)
{
    int mijl,a,b;
    if(st==dr)
    {
        arb[nod]=t[st];
        return arb[nod];
    }

    mijl=(st+dr)/2;
    a=Adauga(2*nod,st,mijl);
    b=Adauga(2*nod+1,mijl+1,dr);
    arb[nod]=a+b;
    return arb[nod];
}

void Update(int nod,int st,int dr,int x,int i)
{
    int mijl;
    if(st==dr)
    {
        arb[nod]=x;
        t[st]=x;
        return;
    }

    mijl=(st+dr)/2;
    if(i<=mijl)
        Update(2*nod,st,mijl,x,i);
    else
        Update(2*nod+1,mijl+1,dr,x,i);

    arb[nod]=arb[2*nod+1]+arb[2*nod];
}



int Query(int nod,int st,int dr,int a,int b)
{
    int mijl,x,y;;
    if(a>dr || st>b)
        return 0;
    if(a <= st && dr <= b)
        return arb[nod];
    mijl=(st+dr)/2;
    x=Query(2*nod,st,mijl,a,b);
    y=Query(2*nod+1,mijl+1,dr,a,b);
    return x+y;
}



int main()
{
    int i,a,b,tip;
    ifstream fin("datorii.in");
    fin>>n>>m;
    for(i=1;i<=n;++i)
        fin>>t[i];

    Adauga(1,1,n);

    ofstream fout("datorii.out");
    for(i=1;i<=m;++i)
    {
        fin>>tip>>a>>b;
        if(tip==0)
            Update(1,1,n,t[a]-b,a);
        else
        {
            r=0;
            r=Query(1,1,n,a,b);
            fout<<r<<"\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}