Cod sursa(job #1796559)

Utilizator topala.andreiTopala Andrei topala.andrei Data 3 noiembrie 2016 16:38:42
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <stdio.h>
using namespace std;
FILE*f=freopen("datorii.in","r",stdin);
FILE*g=freopen("datorii.out","w",stdout);
long long Arb[450010],Val,Poz,divi,z1,z2,S,N,achit,pos;
char buff[290000];
void citire(int &nr)
{
    while(buff[pos] < '0' || buff[pos] > '9') if(++pos == 290000) fread(buff, 1, 290000, stdin), pos = 0;
    nr = 0;
    while('0' <= buff[pos] && buff[pos] <= '9')
    {
        nr = nr * 10 + buff[pos] - '0';
        if(++pos == 290000) fread(buff, 1, 290000, stdin), pos = 0;
    }
}

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 (z1<=left && right<=z2)
    {
        S+=Arb[nod];
        return;
    }
    divi=(left+right)/2;
    if (z1<=divi) Query(2*nod,left,divi);
    if (divi<z2) Query(2*nod+1,divi+1,right);
}
int main()
{
    int M,i,x,op,cost,zi;
    fread(buff, 1, 290000, stdin);
    citire(N);
    citire(M);
    for (i=1;i<=N;i++)
    {
        citire(x);
        Poz=i; Val=x;
        Update(1,1,N);
    }
    for (i=1;i<=M;i++)
    {
        citire(op);
        if (op==0)
        {
            citire(zi);
            citire(cost);
            Poz=zi;
            achit=cost;
            Update(1,1,N);
        }
        else
        {
            citire(z1);
            citire(z2);
            S=0;
            Query(1,1,N);
            printf("%d\n",S);
        }
    }
}