Cod sursa(job #2907953)

Utilizator db_123Balaban David db_123 Data 31 mai 2022 23:02:18
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
	
#include <vector>
	
 
	
using namespace std;
	
 
	
ifstream cin("datorii.in");
	
ofstream cout("datorii.out");
	
 
	
int n,m;
	
vector<int> v,tree;
	
 
	
void read(){
	
    cin>>n>>m;
	
    v.resize(n+1);
	
    tree.resize(4*n);
	
    for(int i=1;i<=n;i++){
	
        cin>>v[i];
	
    }
	
}
	
 
	
void buildTree(int l,int r,int node){
	
    if(l==r){
	
        tree[node]=v[l];
	
        return;
	
    }
	
    int mid=(l+r)/2;
	
    buildTree(l,mid,2*node);
	
    buildTree(mid+1,r,2*node+1);
	
    tree[node]=tree[2*node]+tree[2*node+1];
	
}
	
 
	
void update(int l,int r,int node,int pos,int val){
	
    if(l==r && l==pos){
	
        tree[node]-=val;
	
        return;
	
    }
	
    if(!(pos>=l && pos<=r)){
	
        return;
	
    }
	
    int mid=(l+r)/2;
	
    if(pos<=mid)
	
        update(l,mid,2*node,pos,val);
	
    else
	
        update(mid+1,r,2*node+1,pos,val);
	
    tree[node]=tree[2*node]+tree[2*node+1];
	
}
	
 
	
bool isInside(int l1,int r1,int l2,int r2){
	
    if((l1<=l2 && l2<=r1) && (l1<=r2 && r2<=r1)){
	
        return true;
	
    }
	
    return false;
	
}
	
 
	
bool isIntersected(int l1,int r1,int l2,int r2){
	
    if((l1<=l2 && l2<=r1) || (l1<=r2 && r2<=r1)){
	
        return true;
	
    }
	
    return false;
	
}
	
 
	
int query(int l,int r,int node,int lFind,int rFind){
	
    if((lFind<=l && l<=rFind) && (lFind<=r && r<=rFind)){//isInside(lFind,rFind,l,r)){
	
        return tree[node];
	
    }
	
    else if((lFind>r) || (l>rFind )){//isIntersected(l,r,lFind,rFind)){
	
        return 0;
	
    }
	
 
	
    int mid=(l+r)/2,val1,val2;
	
    val1=query(l,mid,2*node,lFind,rFind);
	
    val2=query(mid+1,r,2*node+1,lFind,rFind);
	
    return val1+val2;
	
}
	
 
	
void solve(){
	
    buildTree(1,n,1);
	
    int a,b,c;
	
    for(int i=1;i<=m;i++){
	
        cin>>a>>b>>c;
	
        if(a==0){
	
            update(1,n,1,b,c);
	
        }
	
        else{
	
            cout<<query(1,n,1,min(c,b),max(c,b))<<"\n";
	
        }
	
    }
	
}
	
 
	
int main(){
	
 
	
    read();
	
    solve();    
	
    return 0;
	
}