Cod sursa(job #1073725)

Utilizator MyrmekoMeMarin Cristian MyrmekoMe Data 6 ianuarie 2014 19:11:20
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#define SIZE 15005
using namespace std;

int n, m, int_tree[ 4 * SIZE ];

int index, value, start, finish, sum;

inline void update(int, int, int);
inline void query(int, int, int);

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", &value);
        index = i;
        update(1, 1, n);
    }

    while( m-- )
    {
        int op, a, b;
        scanf("%d%d%d", &op, &a, &b);
        if( op )
        {
            start = a;
            finish = b;
            sum = 0;
            query(1, 1, n);
            printf("%d\n", sum);
        }
        else
        {
            index = a;
            value = -b;
            update(1, 1, n);
        }
    }

    return 0;
}

inline void update(int node, int left, int right)
{
    if( left == right )
    {
        int_tree[ node ] += value;
        return ;
    }

    int middle = ( left + right ) / 2;

    if( index <= middle)
        update( 2 * node, left, middle );
    else
        update( 2* node + 1, middle + 1, right );
    int_tree[node] = int_tree[ 2 * node] + int_tree[ 2* node + 1];
}

inline void query(int node, int left, int right)
{
    if( start <= left && right <= finish )
    {
        sum += int_tree[ node ];
        return ;
    }

    int middle = ( left + right ) / 2;

    if( start <= middle )
        query( 2 * node, left, middle);
    if( middle < finish)
        query( 2* node + 1, middle + 1, right);
}