Cod sursa(job #1759515)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 19 septembrie 2016 13:24:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <cstdio>
using namespace std;

int m,n,vCitire[15001],suma,a[100000];

void citire()
{
    scanf("%d%d",&m,&n);
    for(int i=1; i<=m; i++)
        scanf("%d",&vCitire[i]);
}

void build(int pai,int st,int dr)
{
    if(st==dr)
    {
        a[pai]=vCitire[st];
        return;
    }
    int mij=(st+dr)/2;
    build(2*pai,st,mij);
    build(2*pai+1,mij+1,dr);
    a[pai]=a[2*pai]+a[2*pai+1];
}

void update(int pai,int st,int dr,int undeTrebuie,int cuCeTrebuie)
{
    if(st==dr)
    {
        a[pai]-=cuCeTrebuie;
        return;
    }
    int mij=(st+dr)/2;
    if(mij>=undeTrebuie)
        update(2*pai,st,mij,undeTrebuie,cuCeTrebuie);
    else
        update(2*pai+1,mij+1,dr,undeTrebuie,cuCeTrebuie);
    a[pai]=a[2*pai]+a[2*pai+1];
}

void aflareSuma(int pai,int st,int dr,int ST,int DR)
{
    if(st>=ST&&dr<=DR)
    {
        suma+=a[pai];
        return;
    }
    int mij=(st+dr)/2;

    if(mij>=ST)
        aflareSuma(2*pai,st,mij,ST,DR);
    if(mij<DR)
        aflareSuma(2*pai+1,mij+1,dr,ST,DR);

}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    citire();
    build(1,1,m);
    int op,st,dr;
    for(int i=1;i<=n;i++)
    {
       scanf("%d%d%d",&op,&st,&dr);
        if(op)
        {
            suma=0;
            aflareSuma(1,1,m,st,dr);
            printf("%d\n",suma);
        }
        else
        {
            update(1,1,m,st,dr);
        }
    }
    return 0;
}