Cod sursa(job #1452067)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 19 iunie 2015 18:27:06
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 15005

typedef struct{
	int s, d, info;
} TArb;

void constr(TArb* arb, int* v, int s, int d, int i);
int query(TArb* arb, int a, int b, int i);
void update(TArb* arb, int a, int b, int i);

int main(){
	freopen("datorie.in", "r", stdin);
	freopen("datorie.out", "w", stdout);
	int n, m, i, v[MAX], nr, k = 1, x, a, b;
	scanf("%d%d", &n, &m);
	for(i = 1; i <= n; i++)
		scanf("%d", &v[i]);

	nr = 2 * n + 5;
	while(nr > 0){
		nr /= 2;
		k *= 2;
	}
	TArb* arb = (TArb*)calloc(k + 1, sizeof(TArb));
	if(!arb) return 0;
	constr(arb, v, 1, n, 1);

	for(i = 0; i < m; i++){
		scanf("%d%d%d", &x, &a, &b);
		
		if(x == 1)
			printf("%d\n", query(arb, a, b, 1));

		else
			update(arb, a, b, 1);
	}

	free(arb);
	return 0;
}

void constr(TArb* arb, int* v, int s, int d, int i){
	arb[i].s = s;
	arb[i].d = d;
	if(s == d){
		arb[i].info = v[s];
		return;
	}

	int mij = (s + d) / 2;
	constr(arb, v, s, mij, 2 * i);
	constr(arb, v, mij + 1, d, 2 * i + 1);
	arb[i].info = arb[2 * i].info + arb[2 * i + 1].info;
}

int query(TArb* arb, int a, int b, int i){
	if(a <= arb[i].s && arb[i].d <= b)
		return arb[i].info;

	int mij = (arb[i].s + arb[i].d) / 2, x = 0, y = 0;
	if(a <= mij)
		x = query(arb, a, b, 2 * i);
	if(b > mij)
		y = query(arb, a, b, 2 * i + 1);
	return  x + y;
}

void update(TArb* arb, int a, int b, int i){
	if(arb[i].s == arb[i].d && arb[i].s == a){
		arb[i].info -= b;
		return;
	}

	int mij = (arb[i].s + arb[i].d) / 2;
	if(a <= mij)
		update(arb, a, b, 2 * i);
	else
		update(arb, a, b, 2 * i + 1);

	arb[i].info = arb[2 * i].info + arb[2 * i + 1].info;
}