Cod sursa(job #3248705)

Utilizator uncle_sam_007ioan bulik uncle_sam_007 Data 12 octombrie 2024 19:29:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

const int NMAX=15001;

int v[NMAX],arb[4*NMAX];

void buildtree(int node, int st, int dr){
    if(st==dr){
        arb[node]=v[st];
    }
    else{
        int mid=(st+dr)/2;
        buildtree(node*2, st, mid);
        buildtree(node*2+1, mid+1, dr);
        arb[node]=arb[node*2]+arb[node*2+1];
    }
}

int value,poz;

void update(int node, int st, int dr){
    if(st==dr && st==poz){
        arb[node]-=value;
    }
    else{
        int mid=(st+dr)/2;
        if(poz<=mid){
            update(node*2,st,mid);
        }
        else{
            update(node*2+1,mid+1,dr);
        }
        arb[node]=arb[node*2]+arb[node*2+1];
    }
}

int query(int node, int st, int dr, int sq, int dq){
    if(sq>dr or dq<st){
        return 0;
    }
    if(sq<=st && dr<=dq){
        return arb[node];
    }
    else{
        int mid=(st+dr)/2;
        int left_sum=query(node*2,st,mid,sq,dq);
        int right_sum=query(node*2+1,mid+1,dr,sq,dq);
        return left_sum+right_sum;
    }
}

int main()
{
    int n,q,a,b;
    bool type;
    fin>>n>>q;
    for(int i=1; i<=n; ++i){
        fin>>v[i];
    }
    buildtree(1,1,n);
    for(int i=1; i<=q; ++i){
        fin>>type>>a>>b;
        if(type==0){
            value=b;
            poz=a;
            update(1,1,n);
        }
        else{
            fout<<query(1,1,n,a,b)<<"\n";
        }
    }
    return 0;
}