Cod sursa(job #1796699)

Utilizator topala.andreiTopala Andrei topala.andrei Data 3 noiembrie 2016 18:04:27
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <stdio.h>
using namespace std;
FILE*f=freopen("datorii.in","r",stdin);
FILE*g=freopen("datorii.out","w",stdout);
int Arb[280000],Val,Poz,S,N,achit,pos,a,b;
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)
    {
        Arb[nod]+=Val;
        return;
    }
    int 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 (a<=left && right<=b)
    {
        S+=Arb[nod];
        return;
    }
    int divi=(left+right)/2;
    if (a<=divi) Query(2*nod,left,divi);
    if (divi<b) Query(2*nod+1,divi+1,right);
}
int main()
{
    int M,i,x,op;
    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);
        citire(a);
        citire(b);
        if (op==0)
        {
            Poz=a;
            Val=-b;
            Update(1,1,N);
        }
        else
        {
            S=0;
            Query(1,1,N);
            printf("%d\n",S);
        }
    }
    return 0;
}