Cod sursa(job #3294104)

Utilizator bazgKleinknecht Dorin bazg Data 15 aprilie 2025 19:36:42
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<bits/stdc++.h>
using namespace std;
int a[15001], arb[60001], posInArb[15001], n, q;

void buildArb(int st, int dr, int nod) {
    if(st==dr) {arb[nod]=a[st]; posInArb[st]=nod;}
    else{
        int mid=(st+dr)/2;
        buildArb(st, mid, nod*2);
        buildArb(mid+1, dr, nod*2+1);
        arb[nod]=arb[nod*2]+arb[nod*2+1];
    }
}

void update(int k, int paid){
    arb[posInArb[k]]-=paid;
    int idx=posInArb[k];
    while(idx>1) {
        idx/=2;
        arb[idx]=arb[idx*2]+arb[idx*2+1];
    }
}

int suma(int a, int b, int st, int dr, int nod) {
    if(st>b || dr<a) return 0;
    if(st>=a && dr<=b) return arb[nod];
    int mid=(st+dr)/2;
    return suma(a,b,st,mid,nod*2)+suma(a,b,mid+1,dr,nod*2+1);
}

int main(){
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    cin>>n>>q;
    for(int i=1; i<=n; i++) cin>>a[i];
    buildArb(1,n,1);
    while(q--) {
        int c; cin>>c;
        if(c==1) {
            int p,q; cin>>p>>q;
            cout<<suma(p,q,1,n,1)<<"\n";
        }
        else{
            int v,t; cin>>t>>v;
            update(t,v);
        }
    }
    return 0;
}