Cod sursa(job #1041716)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 26 noiembrie 2013 00:34:06
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>

#define Nmax (1<<16)+666

using namespace std;
int N,M,A,B,x,ind,answer;
char Buffer;

void scan(int &A,int endline) // endline -> cu flush
{
    A = 0;
    do
    {
        Buffer = fgetc(stdin);
        if('0' <= Buffer && Buffer <= '9')
            A = A * 10 + Buffer - 48;
    }while('0' <= Buffer && Buffer <= '9');
    if( !endline )
        while(Buffer != '\n')
            Buffer = fgetc(stdin);
}

class SegmentTree{
private:
    int range[ Nmax ];
public:
    void Build(int li,int lf,int pz)
    {
        if(li == lf)
        {
            scan(x,li^N);
            range[ pz ] = x;
            return;
        }
        int m = li+((lf-li)>>1);
        Build(li,m,pz<<1);
        Build(m+1,lf,(pz<<1)|1);
        range[ pz ] = range[pz<<1] + range[(pz<<1)|1];
    }
    void Update(int li,int lf,int pz)
    {
        if(li == lf)
        {
            range[ pz ] -= x;
            return;
        }
        int m = li+((lf-li)>>1);
        if(ind <= m)
            Update(li,m,pz<<1);
        else
            Update(m+1,lf,(pz<<1)|1);
        range[ pz ] = range[pz<<1] + range[(pz<<1)|1];
    }
    void Querry(int li,int lf,int pz)
    {
        if(A <= li && lf <= B)
        {
            answer += range[pz];
            return;
        }
        int m = li+((lf-li)>>1);
        if(A <= m)
            Querry(li,m,pz<<1);
        if(B > m)
            Querry(m+1,lf,(pz<<1)|1);
    }

};
SegmentTree aint;

void Read()
{
    scan(N,1);
    scan(M,0);
    aint.Build(1,N,1);
}

void Solve()
{
    int op;
    for(int i = 1; i <= M;++i)
    {
        scan(op,1);
        if(op == 0)
        {
            scan(ind,1);scan(x,0);
            aint.Update(1,N,1);
        }
        else
        {
            answer = 0;
            scan(A,1);scan(B,0);
            aint.Querry(1,N,1);
            printf("%d\n",answer);
        }
    }
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    Read();
    Solve();

    return 0;
}