Cod sursa(job #3292927)

Utilizator abetAlbert Voiculescu abet Data 9 aprilie 2025 19:28:17
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int AINT[60005],n,m,v[15005],x,y,op;
void build(int st, int dr, int node){
    if(st==dr){
        AINT[node]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    build(st, mij, node*2);
    build(mij+1, dr, node*2+1);
    AINT[node]=AINT[node*2]+AINT[node*2+1];
}
void update(int st, int dr, int node, int val, int pos){
    if(st==dr){
        AINT[node]-=val;
        return;
    }
    int mij=(st+dr)/2;
    if(mij<=pos)
        update(st, mij, node*2, val, pos);
    else
        update(mij+1, dr, node*2+1, val, pos);
    AINT[node]=AINT[node*2]+AINT[node*2+1];
}
int query(int st, int dr, int node, int p1, int p2){
    if(p1<=st && dr<=p2){
        return AINT[node];
    }
    int mij=(st+dr)/2;
    int ans=0;
    if(p1<=mij)
        ans += query(st, mij, node*2, p1, p2);
    if(mij+1<=p2)
        ans += query(mij+1, dr, node*2+1, p1, p2);
    return ans;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++){
        in>>v[i];
    }
    build(1, n, 1);
    for(int i=1;i<=m;i++){
        in>>op>>x>>y;
        if(op==0)
            update(1, n, 1, y, x);
        else
            out<<query(1, n, 1, x, y)<<'\n';
    }
    return 0;
}