Cod sursa(job #216551)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 24 octombrie 2008 20:25:18
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <stdio.h>

const int N_MAX = 15010;

int v[N_MAX], aib[N_MAX], N;

inline int tata(int poz)
{
	return (poz + (poz ^ (poz & (poz - 1))));
}

void update(int poz, int val)
{
	while (poz <= N) {
		aib[poz] -= val;
		poz += poz ^ (poz & (poz - 1));
	}
}

int query(int poz)
{
	int sum = 0;
	while (poz) {
		sum += aib[poz];
		poz &= (poz - 1);
	}

	return sum;
}

int main()
{
	freopen("datorii.in", "r", stdin);
#ifndef _SCREEN_
	freopen("datorii.out", "w", stdout);
#endif

	int M;
	scanf("%d %d\n", &N, &M);
	for (int i = 1; i <= N; i++) {
		scanf("%d ", &v[i]);
	}
	
	for (int i = 1; i <= N; i ++) {
		aib[i] += v[i];
		aib[tata(i)] += aib[i];
	}

	int op, a, b;
	for (int i = 1; i <= M; i ++) {
		scanf("%d %d %d\n", &op, &a, &b);
		if (op == 0) update(a, b);
		else printf("%d\n", query(b) - query(a - 1));
	}

	return 0;
}