Cod sursa(job #2216736)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 27 iunie 2018 19:34:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>

using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int aint[400003],n,i,a,m,op,b;
void update(int st,int dr,int pos,int nod)
{
    if(st==dr)
    {
        aint[nod]=a;
    }
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij)
        {
            update(st,mij,pos,nod*2);
        }
        else
        {
            update(mij+1,dr,pos,nod*2+1);
        }
        aint[nod]=aint[2*nod]+aint[2*nod+1];
    }
}
void update2(int st,int dr,int pos,int nod,int nr)
{
    if(st==dr)
    {
        aint[nod]-=nr;
    }
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij)
        {
            update2(st,mij,pos,nod*2,nr);
        }
        else
        {
            update2(mij+1,dr,pos,nod*2+1,nr);
        }
        aint[nod]=aint[nod]-nr;
    }
}
int query(int st,int dr,int p1,int p2,int nod)
{
    if(st==p1 && dr==p2)
    {
        return aint[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if(p2<=mij)
        {
            return query(st,mij,p1,p2,2*nod);
        }
        else if(p1>mij)
        {
            return query(mij+1,dr,p1,p2,2*nod+1);
        }
        else
        {
            return query(st,mij,p1,mij,2*nod)+query(mij+1,dr,mij+1,p2,2*nod+1);
        }
    }
}
int main()
{
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f>>a;
        update(1,n,i,1);
    }
    for(i=1; i<=m; i++)
    {
        f>>op>>b>>a;
        if(op==1)
        {
            g<<query(1,n,b,a,1)<<'\n';
        }
        else
        {
            update2(1,n,b,1,a);
        }
    }
    return 0;
}