Cod sursa(job #2393840)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 1 aprilie 2019 09:36:42
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <cstdio>

#define N 15005

using namespace std;

int m,n,c,a,b;
unsigned int v[N], arbint[4*N];

void construieste(int st=1, int dr=n, int pos=1){
    if(st==dr){
        arbint[pos]=v[st];
        return ;
    }
    int mij  = (st+dr)/2;
    construieste(st,mij,2*pos);
    construieste(mij+1,dr,2*pos+1);
    arbint[pos]=arbint[2*pos]+arbint[2*pos+1];
}

void update(int k, int st = 1, int dr = n, int pos=1){
    if(dr==st){
        arbint[pos]=v[k];
        return ;
    }
    int mij = (st+dr)/2;
    if(k<=mij)
        update(k,st,mij,2*pos);
    else
        update(k,mij+1,dr,2*pos+1);
    arbint[pos]=arbint[2*pos]+arbint[2*pos+1];
}

int datorii(int qst, int qdr, int st = 1, int dr = n, int pos = 1){
    if(qst<=st && dr<=qdr)
        return  arbint[pos];
    int mij = (st+dr)/2;
    if(qdr<=mij)
        return datorii(qst,qdr,st,mij,2*pos);
    if(mij<qst)
        return datorii(qst,qdr,mij+1,dr,2*pos+1);
    return datorii(qst,qdr,st,mij,2*pos)+
            datorii(qst,qdr,mij+1,dr,2*pos+1);
}

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", &v[i]);

    construieste();

    for(int i=0;i<m;++i){
        scanf("%d%d%d", &c, &a, &b);
        if(c==0){
            v[a]-=b;
            update(a);
        }else
            cout<<datorii(a,b)<<"\n";
    }

    return 0;
}