Cod sursa(job #1515120)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 1 noiembrie 2015 10:25:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int v[10*15000+100];;
void update(int nod,int st,int dr,int x,int pos)
{
    if(st==dr)
    {
        v[nod]=x;
    }
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij) update(nod*2,st,mij,x,pos);
        else update(nod*2+1,mij+1,dr,x,pos);
        v[nod]=v[nod*2]+v[nod*2+1];
    }
}
void scade(int nod,int st,int dr,int V,int pos)
{
    if(st==dr)
    {
        v[nod]-=V;
    }
    else
    {
        int mij=(st+dr)/2;
        if(pos<=mij) scade(nod*2,st,mij,V,pos);
        else scade(nod*2+1,mij+1,dr,V,pos);
        v[nod]=v[nod*2]+v[nod*2+1];
    }
}
int querry(int nod,int st,int dr,int P,int Q)
{
    if(st==P&&dr==Q)
    {
        return v[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if(Q<=mij) return querry(nod*2,st,mij,P,Q);
        else if(P>mij) return querry(nod*2+1,mij+1,dr,P,Q);
        else if(P<=mij && Q>mij) return querry(nod*2,st,mij,P,mij)+querry(nod*2+1,mij+1,dr,mij+1,Q);
    }
}
int main()
{
    int n,m,i,a,ok,T,V,P,Q;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>a;
        update(1,1,n,a,i);
    }
    for(i=1;i<=m;i++)
    {
        fin>>ok;
        if(ok==0)
        {
            fin>>T>>V;
            scade(1,1,n,V,T);
        }
        else
        {
            fin>>P>>Q;
            fout<<querry(1,1,n,P,Q)<<"\n";
        }
    }
}