Cod sursa(job #1874430)

Utilizator BlueCodeMihalache Catalin Alexandru BlueCode Data 9 februarie 2017 23:29:10
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n,m,arb[20010],a,b,i,val,poz;
bool op;
void add(int lhs,int rhs,int v)
{int mij;
    if(lhs==poz&&rhs==poz)arb[v]=val;
    else{mij=(lhs+rhs)/2;
        if(poz<=mij)add(lhs,mij,v*2);
        else add(mij+1,rhs,v*2+1);
        arb[v]=arb[v*2]+arb[v*2+1];
        }
}
void update(int lhs,int rhs,int v,int a,int b)
{int mij;
    if(lhs==a&&rhs==a)arb[v]-=b;
    else{mij=(lhs+rhs)/2;
        if(a<=mij)update(lhs,mij,v*2,a,b);
        else update(mij+1,rhs,v*2+1,a,b);
        arb[v]=arb[v*2]+arb[v*2+1];
        }
}
int query(int lhs,int rhs,int v,int a,int b)
{
    if(lhs>=a && rhs<=b)return arb[v];
    int mij=(lhs+rhs)/2;
    int sol1=0,sol2=0;
    if(a<=mij)sol1=query(lhs,mij,v*2,a,b);
    if(b>mij)sol2=query(mij+1,rhs,v*2+1,a,b);
    return sol1+sol2;
}
int main()
{f>>n>>m;
 for(i=1;i<=n;++i)
 f>>val,poz=i,add(1,n,1);
 for(i=1;i<=m;i++)
 {f>>op>>a>>b;
   if(op==0)update(1,n,1,a,b);
     else g<<query(1,n,1,a,b)<<'\n';
 }
}