Cod sursa(job #563342)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 24 martie 2011 22:44:11
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#define M 15005

using namespace std;

int a[M], heap[4*M], n, m, x, p, q, s;

void build(int st, int dr, int nod)
{
    if (st == dr)
    {
        heap[nod] = a[st];
        return;
    }
    int mij = (st+dr)>>1;
    int ns = nod<<1;
    build (st, mij, ns);
    build (mij+1, dr, ns+1);
    heap[nod] = heap[ns] + heap[ns+1];
}

void suma(int st, int dr, int nod)
{
    if (p <= st && q >= dr)
    {
        s += heap[nod];
        return;
    }
    int mij = (st+dr)>>1;
    int ns = nod<<1;
    if (p <= mij)
        suma (st, mij, ns);
    if (q > mij)
        suma (mij+1, dr, ns+1);
}

void add(int st, int dr, int nod)
{
    if (st == dr)
    {
        heap[nod] -= q;
        return;
    }
    int mij = (st+dr)>>1;
    int ns = nod<<1;
    if (p <= mij)
        add (st, mij, ns);
    else
        add (mij+1, dr, ns+1);
    heap[nod] = heap[ns] + heap[ns+1];
}

void citire()
{
    scanf ("%d %d ", &n, &m);
    for (int i=1; i<=n; i++)
        scanf ("%d ", &a[i]);
    build (1, n, 1);
    for (int i=1; i<=m; i++)
    {
        scanf ("%d %d %d ", &x, &p, &q);
        if (x == 1)
        {
            s = 0;
            suma (1, n, 1);
            printf ("%d\n", s);
        }
        else
            add (1, n, 1);
    }
}

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