Cod sursa(job #2129329)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 12 februarie 2018 18:58:34
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int N,M,x,y,s,start,fin,ind,val,Arb[4*15001+100];
bool tip;
void Update1(int nod,int st,int dr){
    if(st==dr){
        Arb[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(st<=mij)Update1(2*nod,st,mij);
    else Update1(2*nod+1,mij+1,dr);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}
void Update2(int nod,int st,int dr){
    if(st==dr){
        Arb[nod]-=val;
        return;
    }
    int mij=(st+dr)/2;
    if(st<=mij)Update2(2*nod,st,mij);
    else Update2(2*nod+1,mij+1,dr);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}
void Query(int nod,int st,int dr){
    if(start<=st&&dr<=fin){
        s+=Arb[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(start<=mij)Query(2*nod,st,mij);
    if(mij<fin)Query(2*nod+1,mij+1,dr);
}
int main()
{
    f>>N>>M;
    for(int i=1;i<=N;++i){
        f>>x;
        ind=i,val=x;
        Update1(1,1,N);
    }
    while(M--){
        f>>tip>>x>>y;
        if(tip==0){
            ind=x,val=y;
            Update2(1,1,N);
        }else{
            s=0;
            start=x,fin=y;
            Query(1,1,N);
            g<<s<<'\n';
        }
    }
    return 0;
}