Cod sursa(job #2958841)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 28 decembrie 2022 16:19:50
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
using namespace std;

//////////////////////////////////////

ifstream cin("datorii.in");
ofstream cout("datorii.out");

const int MAX = 1e5 + 1;

int aint[4 * MAX] , v[MAX] , n , q , st , dr , aux, poz , achitare;

/////////////////////////////////////////////

void initaint( int nod , int st , int dr ){

    if( st == dr ){

        aint[nod] = v[st];

        return ;
    }

    int mij = (st+dr)/2;

    initaint(nod*2,st,mij);
    initaint(nod*2+1,mij+1,dr);

    aint[nod] = aint[nod*2] + aint[nod*2 + 1];

}

int query( int nod , int st , int dr, int qst, int qdr){

    if(qst <= st && dr <= qdr){

        return aint[nod];
    }

    int mij = (st+dr)/2;

    if(qst > mij) return query(nod*2 + 1,mij+1,dr,qst,qdr);
    if(qdr <= mij) return query(nod*2, st, mij,qst,qdr);

    return query(nod*2, st, mij,qst,qdr) + query(nod*2 + 1,mij+1,dr,qst,qdr);
}


void update( int nod , int st , int dr , int pos , int achitare){

    if( st == dr ){

        aint[nod] -= achitare;

        return;
    }

    int mij = (st+dr)/2;

    if(pos <= mij) update(nod * 2, st,mij,pos,achitare);
    if(pos > mij) update(nod * 2 + 1, mij + 1 , dr ,pos,achitare);

    aint[nod] = aint[nod*2] + aint[nod * 2 + 1];

}

int main()
{

    cin >> n >> q;

    for(int i = 1 ; i <= n ; i++){

        cin >> v[i];
    }

    initaint(1,1,n);

    while(q--){

        cin >> aux;

        if(!aux){

            cin >> poz >> achitare;

            update(1,1,n,poz,achitare);
        }

        if(aux){

            cin >> st >> dr;

            cout << query(1,1,n,st,dr) << '\n';
        }
    }

    return 0;
}