Cod sursa(job #2494527)

Utilizator RatataStefan Ratata Data 17 noiembrie 2019 23:25:52
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;
 
int a[100100],h[100100],n,m;
int x,y;
 
void update(int nod,int st,int dr){
 
    //if (x<st || x>dr) return;
 
    if (st==dr){
        h[nod]-=y;
        return;
    }
 
    int mid=(st+dr)/2;
     if (x<=mid) update(nod*2,st,mid);
    else update(nod*2+1,mid+1,dr);
 
    h[nod]=h[2*nod]+h[2*nod+1];
    return;
}
 
int query(int nod,int st,int dr){
 
    //if (x>dr || y<st) return 0;
 
    if (st>=x && dr<=y) return h[nod];
 
    int mid=(st+dr)/2;
    int left=0, right=0;
    if (x<=mid) left=query(nod*2,st,mid);
    if (y>mid) right=query(nod*2+1,mid+1,dr);
 
    return right+left;
}
 
void build(int nod, int start, int end){
 
    if (start==end){
            h[nod]=a[start];
            return;
    }
 
    int mid=(start+end)/2;
    build(2*nod,start,mid);
    build(2*nod+1,mid+1,end);
 
    h[nod]=h[nod*2]+h[nod*2+1];
}
 
int main(){
    ifstream cin ("datorii.in");
    ofstream cout ("datorii.out");
    cin>>n>>m;
    for (int i=1;i<=n;i++) cin>>a[i];
 
    build(1,1,n);
 
    while(m--){
        int k; cin>>k;
        if (k==0){
            cin>>x>>y;
            update(1,1,n);
        }
        else{
        	cin>>x>>y;
        	cout<<query(1,1,n)<<'\n';
        }
    }
 
return 0;
}