Cod sursa(job #587288)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 4 mai 2011 16:35:33
Problema Datorii Scor 80
Compilator cpp Status done
Runda speedt1 Marime 1.21 kb
#include <iostream>
#include <cstring>

using namespace std;

#define NM 100005

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

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

    int mij = (st + dr)/2;

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

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

    int mij = (st + dr)/2;

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

    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]);
        update(1, 1, N, i, A[i]);
    }

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

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

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

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

    return 0;
}