Cod sursa(job #354119)

Utilizator angelaAngela Visuian angela Data 7 octombrie 2009 09:46:19
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.36 kb
// 80 p (un TLE)

#include <stdio.h>
#define DIM 5*15001

int s[DIM];
int n, m;
int i, x;
int cod, k, v, a, b;     // cod, ziua, valoarea, intervalul
int ans;
int X, Y;

void Update(int, int, int);
void Query(int, int, int);

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    scanf("%d%d", &n, &m);

    for (i = 1; i <= n; i++ )
    {
        scanf("%d", &v);
        k = i;
        Update(1, 1, n);
    }

    for (i = 1; i <= m; i++ )
    {
        scanf("%d%d%d", &cod, &X, &Y);
        if ( cod == 0 )
        {
            k = X;
            v = -Y;
            Update(1, 1, n);
        }
        else
        {
            a = X, b = Y;
            Query(1, 1, n);
            printf("%d\n", ans);
            ans = 0;
        }

    }
    return 0;
}

void Update(int nod, int left, int right)
{
    if ( left == right )
    {
        s[nod] += v;
        return;
    }
    int mid = (left + right) / 2;
    if ( k <= mid )
        Update(2 * nod, left, mid);
    else
        Update(2 * nod + 1, mid + 1, right);
    s[nod] = s[2 * nod] + s[2 * nod + 1];
}

void Query(int nod, int left, int right)
{
    if ( a <= left && right <= b )
    {
       ans += s[nod];
       return;
    }
    int mid = (left + right) / 2;
    if ( a <= mid )
        Query(2 * nod, left, mid);
    if ( b > mid )
        Query(2 * nod + 1, mid + 1, right);
}