Cod sursa(job #1777127)

Utilizator matei140401Iorgulescu Matei matei140401 Data 12 octombrie 2016 08:26:20
Problema Datorii Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.46 kb
#include <cstdio>
#include <fstream>

using namespace std;
int maxim=0;
int sum;
int v[100001],aint[100001];

void update(int nod,int st,int dr,int poz,int x)
{
    if(st==dr)
    {
        aint[nod]-=x;
        v[poz]-=x;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(nod*2,st,mij,poz,x);
    else
        update(nod*2+1,mij+1,dr,poz,x);
    aint[nod]=aint[nod*2]+aint[nod*2+1];
}
void query(int nod,int st,int dr,int A,int B)
{
    if(A<=st&&dr<=B)
    {
        sum+=aint[nod];
              return ;
    }
    int mij=(st+dr)/2;
    if(mij>=A)
        query(nod*2,st,mij,A,B);
    if(mij+1<=B)
        query(nod*2+1,mij+1,dr,A,B);
}
void Build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aint[nod]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    Build(nod*2,st,mij);
    Build(nod*2+1,mij+1,dr);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
int main()
{
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
    int n,m,i,ok,a,b;

    fin>>n>>m;
    for(i=1; i<=n; i++)
        fin>>v[i];
    Build(1,1,n);
    for(i=1; i<=m; i++)
    {
        fin>>ok>>a>>b;
        //fout<<ok<<" "<<a<<" "<<b<<"\n";
        if(ok==0)
            update(1,1,n,a,b);
            else
            {
                sum=0;
                query(1,1,n,a,b);
                fout<<sum<<"\n";
            }
    }
    for(i=1;i<=n;i++)
    //fout<<v[i]<<" ";


    return 0;
}