Cod sursa(job #2267213)

Utilizator BRIOI19Ben Test BRIOI19 Data 23 octombrie 2018 14:22:59
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
using namespace std;
int a[15010];
int tree[150000];
void build(int node,int start,int end){
    if(start == end){
        tree[node] = a[start];
    }else{
        int mid = (start+end)/2;
        build(2*node,start,mid);
        build(2*node+1,mid+1,end);
        tree[node] = tree[2*node] + tree[2*node+1];
    }
    
}
void update(int node,int start,int end,int indx,int val){
    if(start == end){
        a[indx] += val;
        tree[node] += val;
    }else{
        int mid = (start+end)/2;
        if(start<=indx && indx<=mid){
            update(2*node,start,mid,indx,val);
        }else{
            update(2*node+1,mid+1,end,indx,val);
        }
        tree[node] = tree[2*node] + tree[2*node+1];
    }
}
int query(int node,int start,int end,int l,int r){
    if(r<start ||end<l){
        return 0;
        
    }else{
        //std::cout<<start<<" "<<end<<endl;
        if(l<=start && end<=r){
            return tree[node];
        }
        int mid = (start+end)/2;
        int p1 = query(2*node,start,mid,l,r);
        int p2 = query(2*node+1,mid+1,end,l,r);
       
        return p1+p2;
    }
}
int main() {
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
	int n,m;
	fin>>n>>m;
	for(int i=1;i<=n;i++){
	    fin>>a[i];
	    //cout<<a[i];
	}
	build(1,1,n);
	//std::cout<<"built"<<endl;
	while(m--){
	    int x;
	    fin>>x;
	    if(x == 1){
	        int l,r;
	        fin>>l>>r;
	        fout<<query(1,1,n,l,r)<<endl;
	    }else{
	        int t,v;
	        fin>>t>>v;
	        //cout<<a[t]-v<<endl;
	        update(1,1,n,t,-v);
	    }
	}
	
}