Cod sursa(job #827836)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 2 decembrie 2012 18:35:57
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#define LS(p) (p<<1)
#define RS(p) ((p<<1)+1)
#define NMAX  (1<<15)
using namespace std;


ifstream in("datorii.in");
ofstream out("datorii.out");

int V[NMAX],N,T;

void Update(int current_position,int start,int final,int pos,int value)
{
    if(start == final)
        V[current_position] += value;
    else
    {
        int med = (start + final) / 2;
        if(pos <=med)
            Update(LS(current_position),start,med,pos,value);
        else
            Update(RS(current_position),med+1,final,pos,value);
        V[current_position] += value;
    }
}

int Query(int current_position,int start,int final,int begin,int end)
{
    if(start>=begin && final <= end)
        return V[current_position];
    int med = (start + final) / 2, value = 0;
    if(begin <= med)
        value+= Query(LS(current_position),start,med,begin,end);
    if(med+1 <= end)
        value+= Query(RS(current_position),med+1,final,begin,end);
    return value;
}


int main()
{
    int i,x,a,b;
    bool op;
    in>>N>>T;
    for(i=1;i<=N;i++)
        in>>x,Update(1,1,N,i,x);
    while(T--)
    {
        in>>op>>a>>b;
        if(op)
            out<<Query(1,1,N,a,b)<<'\n';
        else // achitare
            Update(1,1,N,a,-b);
    }
    return 0;
}