Cod sursa(job #1965491)

Utilizator RaduToporanRadu Toporan RaduToporan Data 14 aprilie 2017 14:10:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <cstdio>

using namespace std;
int n,m,i,cod,start,finish,restante,nrzi,suma,v[15005],arb[60005];

void creare(int nod, int st, int dr)
{
    if (st==dr)
        arb[nod]=v[st];
    else
    {
        int mij=(st+dr)/2;
        creare(2*nod,st,mij);
        creare(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]-suma);
    else
    {
        int mij=(st+dr)/2;
        if (nrzi<=mij) achitare(2*nod,st,mij);
            else achitare(2*nod+1,mij+1,dr);
        arb[nod]=arb[2*nod]+arb[2*nod+1];
    }
}

void interogare(int nod, int st, int dr)
{
    if (start<=st && dr<=finish)
        restante=restante+arb[nod];
    else
    {
        int mij=(st+dr)/2;
        if (start<=mij) interogare(2*nod,st,mij);
        if (mij+1<=finish) interogare(2*nod+1,mij+1,dr);
    }
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1; i<=n; i++)
        scanf("%d",&v[i]);
    creare(1,1,n);
    for (i=1; i<=m; i++)
    {
        scanf("%d",&cod);
        if (cod==0)
        {
            scanf("%d%d",&nrzi,&suma);
            achitare(1,1,n);
        }
        else
        {
            scanf("%d%d",&start,&finish);
            restante=0;
            interogare(1,1,n);
            printf("%d\n",restante);
        }
    }
    return 0;
}