Cod sursa(job #642564)

Utilizator rootsroots1 roots Data 1 decembrie 2011 18:08:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <cstring>

#define TSize 32769

using namespace std;

ifstream in;
ofstream out;

int T[TSize];
int sol;

inline void update(int nod,int L,int R,int pos,int val)
{
    if(L==pos&&pos==R)
    {
        T[nod]+=val;
        return;
    }

    int M=(L+R)>>1;

    if(pos<=M) update(nod<<1,L,M,pos,val);
    else update((nod<<1)+1,M+1,R,pos,val);

    T[nod]+=val;
}

inline void query(int nod,int L,int R,int a,int b)
{
    if(a<=L&&R<=b)
    {
        sol+=T[nod];
        return;
    }

    int M=(L+R)>>1;

    if(a<=M) query(nod<<1,L,M,a,b);
    if(b>M) query((nod<<1)+1,M+1,R,a,b);
}

int main()
{
    int M,N,x,a,b;

    in.open("datorii.in");

    in>>N>>M;
    for(int i=1;i<=N;++i)
    {
        in>>x;
        update(1,1,N,i,x);
    }

    out.open("datorii.out");

    for(;M--;)
    {
        in>>x>>a>>b;
        if(x==0) update(1,1,N,a,-b);
        else
        {
            sol=0;
            query(1,1,N,a,b);
            out<<sol<<'\n';
        }
    }

    in.close();
    out.close();

    return 0;
}