Cod sursa(job #2289189)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 24 noiembrie 2018 11:51:28
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
#define NMAX 16000
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int A[4*NMAX],n,m,V[NMAX];
int poz;
int start,stop;
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 qry(int l,int r, int node){
    if(l>=start&&r<=stop)
        return A[node];

    int mid=(l+r)/2;
    int max1=0,max2=0;
    if(start<=mid)max1=qry(l,mid,2*node);
    if(mid+1<=stop)max2=qry(mid+1,r,2*node+1);
    return max1+max2;
}
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 citire(){
    f>>n>>m;
    for(int i=1,x;i<=n;i++)f>>V[i];
    build(1,n,1);
}
int main()
{
    citire();

    for(int i=1,type,x,y;i<=m;i++){
        f>>type>>x>>y;
        if(type){
            start=x;stop=y;
            g<<qry(1,n,1)<<"\n";
        }else{
            poz = x;
            V[x]-=y;
            update(1,n,1);
        }
    }


    return 0;
}