Cod sursa(job #3173059)

Utilizator TheEpicWipedCreaVlad Chirita Alexandru TheEpicWipedCrea Data 21 noiembrie 2023 20:09:43
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");

#define maxN 15000
int aint[4*maxN],v[maxN];

void build(int nod, int left, int right){
    if(left==right){
        aint[nod]=v[left];
        return;
    }
    int mid,lson,rson;
    mid=(left+right)/2;
    lson=nod*2;
    rson=lson+1;
    build(lson,left,mid);
    build(rson,mid+1,right);
    aint[nod]=aint[lson]+aint[rson];
}

int query(int nod, int nleft, int nright, int qleft, int qright){
    if(nleft>=qleft && nright<=qright){
        return aint[nod];
    }

    int mid,lson,rson,res;
    mid=(nleft+nright)/2;
    lson=nod*2;
    rson=lson+1;

    res=0;
    if(qleft<=mid){
        res+=query(lson,nleft,mid,qleft,qright);
    }
    if(mid<qright){
        res+=query(rson,mid+1,nright,qleft,qright);
    }
    return res;
}

void update(int nod, int left, int right, int poz, int val){
    if(left==right){
        aint[nod]-=val;
        return;
    }
    int mid,lson,rson;
    mid=(left+right)/2;
    lson=2*nod;
    rson=lson+1;

    if(poz<=mid){
        update(lson,left,mid,poz,val);
    }
    else{
        update(rson,mid+1,right,poz,val);
    }

    aint[nod]=aint[lson]+aint[rson];
}

int main(){
    int n,q;
    in>>n>>q;
    for(int i=1;i<=n;i++){
        in>>v[i];
    }
    build(1,1,n);
    for(int i=1;i<=q;i++){
        int type,a,b;
        in>>type>>a>>b;
        if(type==1){
            out<<query(1,1,n,a,b)<<'\n';
        }
        else{
            update(1,1,n,a,b);
        }
    }
}