Cod sursa(job #213645)

Utilizator Mishu91Andrei Misarca Mishu91 Data 10 octombrie 2008 19:11:42
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

#define MAX_N 15005

int Pos, Val, V[MAX_N], T[MAX_N << 2];
int N, M;
int start, end;
long long Rez;

void update(int nod, int li, int lf)
{
    if(li == lf)
    {
        T[nod] = Val;
        return;
    }

    int mij = (li + lf) >> 1;
    if(Pos <= mij)
        update(2 * nod, li, mij);
    else
        update(2 * nod + 1, mij + 1, lf);
    T[nod] = T[2*nod] + T[2*nod + 1];
}

void querry(int nod, int li, int lf)
{
    if(start <= li && end >= lf)
    {
        Rez += T[nod];
        return;
    }

    int mij = (li + lf) >> 1;
    if(start <= mij)
        querry(2 * nod, li, mij);
    if(end > mij)
        querry(2 * nod + 1, mij + 1, lf);
}

void citire()
{
    scanf("%d %d",&N, &M);

    for(int i = 1; i <= N; ++i)
    {
        scanf("%d",V+i);
        Pos = i, Val = V[i];
        update(1,1,N);
    }
}

void solve()
{
    int t,x,y;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d",&t,&x,&y);

        if(!t)
        {
            Pos = x;
            Val = V[x] - y;
            update(1,1,N);
        }
        else
        {
            start = x;
            end = y;
            Rez = 0;
            querry(1,1,N);
            printf("%lld\n",Rez);
        }
    }
}

int main()
{
    freopen("datorii.in","rt",stdin);
    freopen("datorii.out","wt",stdout);
    citire();
    solve();
}