Cod sursa(job #305561)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 17 aprilie 2009 19:57:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<algorithm>
using namespace std;

#define DIM 15001

int n,m,x,y,poz,sum,val,a[4*DIM];

void query(int nod,int st,int dr){
    int mij;

    if(x<=st&&dr<=y){
        sum+=a[nod];
        return;}
    mij=(st+dr)/2;
    if(x<=mij)
        query(2*nod,st,mij);
    if(mij<y)
        query(2*nod+1,mij+1,dr);}

void update1(int nod,int st,int dr){
    int mij;

    if(st==dr){
        a[nod]-=val;
        return;}
    mij=(st+dr)/2;
    if(poz<=mij)
        update1(2*nod,st,mij);
    else
        update1(2*nod+1,mij+1,dr);
    a[nod]=a[2*nod]+a[2*nod+1];}

void update0(int nod,int st,int dr){
    int mij;

    if(st==dr){
        a[nod]=val;
        return;}
    mij=(st+dr)/2;
    if(poz<=mij)
        update0(2*nod,st,mij);
    else
        update0(2*nod+1,mij+1,dr);
    a[nod]=a[2*nod]+a[2*nod+1];}

void solve(){
    int i,tip;

    scanf("%d%d",&n,&m);
    for(i=1; i<=n; ++i){
        scanf("%d",&val);
        poz=i;
        update0(1,1,n);}
    for(i=1; i<=m; ++i){
        scanf("%d%d%d",&tip,&x,&y);
        if(!tip){
            poz=x;
            val=y;
            update1(1,1,n);}
        else{
            sum=0;
            query(1,1,n);
            printf("%d\n",sum);}}}

int main(){

    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    solve();
    return 0;}