Cod sursa(job #1990843)

Utilizator NomiusNicu Balaban Nomius Data 13 iunie 2017 21:21:24
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <stdio.h>

int n, m;
int v[15001];
int ftree[15001];

int ftree_read(int i) {
	int sum = 0;
	while (i > 0) {
		sum += ftree[i];
		i -= i & -i;
	}
	return sum;
}

void ftree_add(int i, int val) {
	while (i <= 15001) {
		ftree[i] += val;
		i += i & -i;
	}
}

void read_data() {
	//freopen("input", "r", stdin);
	FILE *f = fopen("datorii.in", "r");

	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &v[i]);
		ftree_add(i, v[i]);
	}

	fclose(f);
}

inline int op_A(int pos, int val) {
	ftree_add(pos, -val);
}

inline int op_B(int pos1, int pos2) {
	return ftree_read(pos2) - ftree_read(pos1 - 1);
}

int main(void) {
	FILE *f = fopen("datorii.out", "w");

	read_data();
	int op, a, b;

	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &op, &a, &b);
		if (op) {
			fprintf(f, "%d\n", op_B(a, b));
		} else {
			op_A(a, b);
		}
	}

	fclose(f);
	return 0;
}