Cod sursa(job #2289194)

Utilizator roberthostiucHostiuc Robert Gabriel roberthostiuc Data 24 noiembrie 2018 11:53:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define Nmax 1000005

using namespace std;

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

int v[Nmax],A[4*Nmax],n,m;
int poz,start,stop;

void citire(){
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
}

void build(int l,int r,int node){
    if(l==r)
        A[node]=v[l];
    else {
        int mid=(l+r)/2;
        build(l,mid,2*node);
        build(mid+1,r,2*node+1);
        A[node]=A[2*node]+A[2*node+1];
    }

}

void update(int l, int r, int node){
    if(l==r){
        A[node]=v[l];
    }
    else{
        int mid=(l+r)/2;
        if(poz<=mid)
            update(l,mid,2*node);
        else update(mid+1,r,2*node+1);
        A[node]=A[2*node]+A[2*node+1];
    }
}

int query(int l, int r, int node){
    if(start<=l and stop>=r)return A[node];
    else {
        int mid=(l+r)/2;
        int maxl=INT_MIN,maxr=INT_MIN;
        int suml=0,sumr=0;
        if(start<=mid)suml=query(l,mid,2*node);
        if(mid+1<=stop)sumr=query(mid+1,r,2*node+1);
        return suml+sumr;
    }
}

void rezolvare(){
    citire();
    build(1,n,1);
    for(int i=1,op,x,y;i<=m;i++){
        fin>>op>>x>>y;
        if(op==1){
            start=x;stop=y;
            fout<<query(1,n,1)<<"\n";
        }
        else {

                v[x]-=y;
                poz=x;
                update(1,n,1);
        }
    }
}

int main()
{
    rezolvare();

    return 0;
}