Cod sursa(job #2129693)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 12 februarie 2018 23:33:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
//Been waiting for a

#include <bits/stdc++.h>
using namespace std;

int arb[4*15001+100];
int n,m,a,b,Max,start,stop,val,indice,test,suma;

inline int maxim(int a, int b)
{
    if(a>b)return a;
    else return b;
}

inline void update(int nod, int st, int dr,bool intrare)
{
    if(st == dr)
    {
        if(intrare==1)
            arb[nod]=val;
        else arb[nod]-=val;

        return;
    }

    int mij=(st+dr)/2;
    if(indice <= mij) update(nod*2,st,mij,intrare);
    else update(nod*2+1,mij+1,dr,intrare);

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

inline void query(int nod, int st, int dr)
{
    if(start <= st && dr <=stop)
    {
        suma+=arb[nod];
        return;
    }
    int mij=(st+dr)/2;

    if(start <=mij) query(nod*2,st,mij);
    if (mij<stop)query(nod*2+1,mij+1,dr);


}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);

        indice = i;
        val = a;
        update(1,1,n,1);
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%d",&test);
        scanf("%d %d",&a,&b);

                if(test==1)
                {
                    start=a,stop=b;
                     suma = 0;
                    query(1,1,n);

                    printf("%d\n",suma);
                }
                else{
                    indice = a, val = b;

                    update(1,1,n,0);
                }

    }
    return 0;
}