Cod sursa(job #1976126)

Utilizator Daria09Florea Daria Daria09 Data 2 mai 2017 20:13:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#define DIM 15005
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n,m,a[DIM],arb[DIM*4+5],start,finish,val,pos,ans;
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        arb[nod]=a[st];
        return;
    }
    int mij=(st+dr)/2;
    update(2*nod,st,mij);
    update(2*nod+1,mij+1,dr);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void achitare(int nod,int st,int dr)
{
    if(st==dr)
        {
            arb[nod]=max(0,arb[nod]-val);
            return;
        }
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij)
        achitare(2*nod,st,mij);
        else
            achitare(2*nod+1,mij+1,dr);
        arb[nod]=arb[2*nod]+arb[2*nod+1];
    }
}
void query(int nod,int st,int dr)
{
    if(start<=st&&finish>=dr)
    {
        ans+=arb[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(start<=mij)query(2*nod,st,mij);
    if(mij<finish)query(2*nod+1,mij+1,dr);
}
void solve()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        f>>a[i];
    update(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int x,a,b;
        f>>x>>a>>b;
        if(x==0)
        {
            pos=a;
            val=b;
            achitare(1,1,n);
        }
        else
        {
            ans=0;
            start=a;
            finish=b;
            query(1,1,n);
            g<<ans<<'\n';
        }
    }
}
int main()
{
    solve();
    f.close();
    g.close();
    return 0;
}