Cod sursa(job #2072341)

Utilizator Constantin.Dragancea Constantin Constantin. Data 21 noiembrie 2017 19:08:15
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

int o,H[70010],n,m,idx,nr,l,r;

void update1(int nod, int st, int dr){
    if (st==dr){
        H[nod]=nr;
        return;
    }
    int mid=(st+dr)/2;
    if (idx<=mid) update1(2*nod,st,mid);
    else update1(2*nod+1,mid+1,dr);
    H[nod]=H[2*nod]+H[2*nod+1];
}

void update2(int nod, int st, int dr){
    if (st==dr){
        H[nod]-=nr;
        return;
    }
    int mid=(st+dr)/2;
    if (idx<=mid) update2(2*nod,st,mid);
    else update2(2*nod+1,mid+1,dr);
    H[nod]=H[2*nod]+H[2*nod+1];
}

int query(int nod, int st, int dr){
    if (l<=st && r>=dr) return H[nod];
    int mid=(st+dr)/2;
    int left=0, right=0;
    if (l<=mid) left=query(2*nod,st,mid);
    if (r>mid) right=query(2*nod+1,mid+1,dr);
    return left+right;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    ifstream cin ("datorii.in");
    ofstream cout ("datorii.out");
    cin>>n>>m;
    for (int i=1; i<=n; i++){
        cin>>nr;
        idx=i;
        update1(1,1,n);
    }
    for (int i=1; i<=m; i++){
        cin>>o;
        if (!o){
            cin>>idx>>nr;
            update2(1,1,n);
        }
        else{
            cin>>l>>r;
            cout<<query(1,1,n)<<"\n";
        }
    }
    return 0;
}