Cod sursa(job #642707)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 1 decembrie 2011 22:10:31
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
#define inf "datorii.in"
#define outf "datorii.out"
#define DIM 40000
using namespace std;

fstream f(inf, ios::in), g(outf, ios::out);

int ArbSum[DIM];
int N, M;
int pos, val;
int st, dr;
int sum;

void Update(int nod, int left, int right)
{
    if( left==right )
    {
        ArbSum[nod] -= val;
        return;
    }
    int m = (left+right)/2;
    if( pos<=m ) Update(2*nod, left, m);
    else Update(2*nod+1, m+1, right);

    ArbSum[nod] = ArbSum[2*nod] + ArbSum[2*nod+1];
}

void Query(int nod, int left, int right)
{
    if( left>=st && right<=dr )
    {
        sum += ArbSum[nod];
        return;
    }
    int m = (left+right)/2;
    if( st <= m ) Query(2*nod, left, m);
    if( m < dr ) Query(2*nod+1, m+1, right);
}

void solve()
{
    f>>N>>M;
    for(int i=1; i<=N; i++)
    {
        f>>val;
        val = -val; pos = i;
        Update(1,1,N);
    }
    int op, A, B;
    for(int i=1; i<=M; i++)
    {
        f>>op>>A>>B;
        if( op==0 )
        {
            pos = A; val = B;
            Update(1,1,N);
        }
        else
        {
            st = A; dr = B;
            sum = 0;
            Query(1,1,N);
            g<<sum<<"\n";
        }
    }
}

int main()
{
	solve();
	f.close(); g.close();
	return 0;
}