Cod sursa(job #2310440)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 31 decembrie 2018 16:41:59
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define Dim 15008
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int V[Dim],Arb[4*Dim+1],N,M,sum;
int op,P,Q,T,val;

void Init(int st,int dr,int nod)
{
    if(st==dr)
    {
        Arb[nod]=V[st];
        return;
    }
    int mij=(st+dr)/2;
    Init(st,mij,2*nod);
    Init(mij+1,dr,2*nod+1);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}

void Query(int st,int dr,int nod)
{
    if(st>=P&&dr<=Q)
    {
        sum+=Arb[nod];
        if(dr==Q)
        {
            g<<sum<<'\n';
            return;
        }
    }else
    {
        int mij=(st+dr)/2;
        if(P<=mij)
            Query(st,mij,2*nod);
        if(Q>mij)
            Query(mij+1,dr,2*nod+1);
    }
}

void Update(int st,int dr,int nod)
{
    if(st==dr&&st==T)
    {
        Arb[nod]-=val;
        return;
    }
    int mij=(st+dr)/2;
    if(T<=mij)
        Update(st,mij,2*nod);
    if(T>mij)
        Update(mij+1,dr,2*nod+1);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>V[i];
    Init(1,N,1);
    for(int i=1;i<=M;i++)
    {
        f>>op;
        if(op)
        {
           sum=0;
           f>>P>>Q;
           Query(1,N,1);
        }
        else
        {
           f>>T>>val;
           Update(1,N,1);
        }
    }
    return 0;
}