Cod sursa(job #1487521)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 16 septembrie 2015 22:58:45
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
#define left_son(x) ((x) << 1)
#define right_son(x) (((x) << 1) + 1)
using namespace std;

const int nrMax = 15000;

int n, m;
int sum_Aint[4 * nrMax + 5];

void update(int left, int right, int val, int poz, int pozfin)
{
    if (left == right) {sum_Aint[poz] += val; return;}
    else
    {
        int mij = (left + right) >> 1;
        if (pozfin <= mij) update(left, mij, val, left_son(poz), pozfin);
        else update(mij + 1, right, val, right_son(poz), pozfin);
        sum_Aint[poz] = sum_Aint[left_son(poz)] + sum_Aint[right_son(poz)];
    }
}

int querry(int left, int right, int start, int finish, int poz)
{
    if (left >= start && right <= finish)
            return sum_Aint[poz];
    int mij = (left + right) >> 1, answer = 0;
    if (mij >= start) answer += querry(left, mij, start, finish, left_son(poz));
    if (mij < finish) answer += querry(mij + 1, right, start, finish, right_son(poz));
    return answer;
}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1, x; i <= n; i++)
    {
        scanf("%d", &x);
        update(1, n, x, 1, i);
    }
    for (int i = 1, op, a, b; i <= m; i++)
    {
        scanf("%d %d %d", &op, &a, &b);
        if (!op)
        {
            b *= -1;
            update(1, n, b, 1, a);
        }
        else
            printf("%d\n", querry(1, n, a, b, 1));
    }
    return 0;
}