Cod sursa(job #2924863)

Utilizator GasparAndreiGaspar Andrei GasparAndrei Data 12 octombrie 2022 17:35:27
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cmath>

using namespace std;
#define Inf 0x3f3f3f3f

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

int n,q,op,x,y;
int a[15005];
int aint[100005];

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

    if(st == dr){
        aint[nod] = a[st];
        return;
    }   
    int mij = (st + dr) / 2;
    buildtree(nod * 2,st,mij);
    buildtree(nod * 2 + 1, mij + 1, dr);

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

}

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

    if(st == dr){
        aint[nod] = a[st];
        return;
    }
    int mij = (st + dr) / 2;
    if(pos <= mij)
        update(nod * 2,st,mij,pos);
    else
        update(nod * 2 + 1,mij + 1,dr, pos);
    
    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];

}
int query(int nod,int st,int dr,int x,int y){

    if(x <= st && dr <= y)
        return aint[nod];

    int mij = (st + dr) / 2;
    int queryst = 0,querydr = 0;
    if(x <= mij)
        queryst = query(nod * 2, st,mij,x,y);
    if(mij < y)
        querydr = query(nod * 2 + 1,mij + 1,dr,x,y);

    return queryst + querydr;
}

int main(){
    
    cin >> n >> q;
    for(int i = 1 ; i <= n ; ++i)
        cin >> a[i];

    buildtree(1,1,n);

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

        cin >> op >> x >> y;
        if(op == 0){

            a[x] -= y;
            update(1,1,n,x);

        }
        else
            cout << query(1,1,n,x,y) << '\n';

    }

    

    

    return 0;
}