Cod sursa(job #2422475)

Utilizator S_DanSochirca Dan S_Dan Data 18 mai 2019 21:52:10
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;

int a[100100],h[100100],n,m;
int st,dr,index,nod;
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;
    update(nod*2,st,mid);
    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=query(nod*2,st,mid);
    int 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);

    int left=h[nod*2];
    int right=h[nod*2+1];

    h[nod]=left+right;
}

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;
}