Cod sursa(job #1796633)

Utilizator topala.andreiTopala Andrei topala.andrei Data 3 noiembrie 2016 17:25:46
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 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,divi,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)
{
    Arb[nod]=+Val;
    if (left==right)
    {
        return;
    }
    divi=(left+right)/2;
    if (Poz<=divi) Update(2*nod,left,divi);
    else Update(2*nod+1,divi+1,right);

}
void Query(int nod,int left,int right)
{
    if (a<=left && right<=b)
    {
        S+=Arb[nod];
        return;
    }
    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);
        }
    }
}