Cod sursa(job #587297)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 4 mai 2011 16:38:36
Problema Datorii Scor 100
Compilator cpp Status done
Runda speedt1 Marime 1.22 kb
#include <iostream>
#include <cstring>

using namespace std;

#define NM 100005

int A[NM], ARB[3*NM], ans, N, M, a, b;

void query (int nod, int st, int dr)
{
    if (a <= st && dr <= b)
    {
        ans += ARB[nod];
        return ;
    }

    int mij = (st + dr)/2;

    if (a <= mij) query (2*nod, st, mij);
    if (b >= mij + 1) query (2*nod + 1, mij + 1, dr);
}

void update (int nod, int st, int dr)
{
    if (st == dr)
    {
        ARB[nod] += b;
        return ;
    }

    int mij = (st + dr)/2;

    if (a <= mij) update(2*nod, st, mij);
    else update(2*nod + 1, mij + 1, dr);

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

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

    scanf ("%d %d", &N, &M);

    for (int i = 1; i <= N; ++i)
    {
        scanf ("%d", &A[i]);
        a = i, b = A[i];
        update(1, 1, N);
    }

    for (int i = 1; i <= M; ++i)
    {
        int op, t, v;

        scanf ("%d %d %d", &op, &t, &v);

        a = t, b = v;

        if (!op)
        {
            b = -b;
            update (1, 1, N);
        }
        else
        {
            ans = 0;
            query (1, 1, N);

            printf ("%d\n", ans);
        }
    }

    return 0;
}