Cod sursa(job #2907936)

Utilizator db_123Balaban David db_123 Data 31 mai 2022 22:44:07
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 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(!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;
}