Cod sursa(job #1796361)

Utilizator topala.andreiTopala Andrei topala.andrei Data 3 noiembrie 2016 13:37:08
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
long long Arb[450010],Val,Poz,divi,z1,z2,S,N,achit;
void Update(int nod,int left,int right)
{
    if (left==right)
    {
        if (achit==0) Arb[nod]=Val;
        else Arb[nod]-=achit;
        return;
    }
    divi=(left+right)/2;
    if (Poz<=divi) Update(2*nod,left,divi);
    else Update(2*nod+1,divi+1,right);

    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}
void Query(int nod,int left,int right)
{
    if (left<=z1 && right<=z2)
    {
        S+=Arb[nod];
        return;
    }
    divi=(left+right)/2;
    if (z1<=divi) Query(2*nod,left,divi);
    if (z2<divi) Query(2*nod+1,divi+1,right);
}
int main()
{
    int M,i,x,op,cost,zi;
    f>>N>>M;
    for (i=1;i<=N;i++)
    {
        f>>x;
        Poz=i; Val=x;
        Update(1,1,N);
    }
    for (i=1;i<=M;i++)
    {
        f>>op;
        if (op==0)
        {
            f>>zi>>cost;
            Poz=zi;
            achit=cost;
            Update(1,1,N);
        }
        else
        {
            f>>z1>>z2;
            S=0;
            Query(1,1,N);
            g<<S<<'\n';
        }
    }
}