Cod sursa(job #60621)

Utilizator risenshineAkil Nasser risenshine Data 15 mai 2007 18:10:07
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <time.h>
#define NMAX 100000

typedef struct {
	int a, b;
	int s;
} p;
p tree[NMAX];
int N, M;
int A[NMAX], cod, t, v;

int search(int a, int b, int i) {
	if (tree[i].a == a && tree[i].b == b)
		return tree[i].s;
	else if (a <= tree[i].a && b >= tree[i].b)
		return tree[i].s;
	else
		if (a >= tree[i].a && a <= tree[i].b) {
			if (b <= tree[i].b)
				return search(a, b, 2*i) + search(a, b, 2*i+1);
			else
				return search(a, tree[i].b, 2*i) + search(a, tree[i].b, 2*i+1);
		}
		else {
			if (b >= tree[i].a && b <= tree[i].b)
				return search(tree[i].a, b, 2*i) + search(tree[i].a, b, 2*i+1);
			else
				return 0;
		}
}
void build(int i) {
	int j;
	tree[i].s = 0;
	for (j = tree[i].a; j <= tree[i].b; ++j)
		tree[i].s += A[j];
	if (tree[i].a != tree[i].b) {
		int m = (tree[i].a + tree[i].b)/2;
		tree[2*i].a = tree[i].a, tree[2*i].b = m;
		build(2*i);
		tree[2*i+1].a = m+1, tree[2*i+1].b = tree[i].b;
		build(2*i+1);
	}
}
void add(int i) {
	tree[i].s -= v;
	if (tree[i].a != tree[i].b) {
		if (t <= tree[2*i].b)
			add(2*i);
		else
			add(2*i+1);
	}
}

int main() {
	FILE *fi = freopen("datorii.in", "r", stdin);
	FILE *fo = freopen("datorii.out", "w", stdout);
	int i;
	clock_t begin, end;
	begin = clock();
	scanf("%d%d", &N, &M);
	for (i = 1; i <= N; ++i)
		scanf("%d", &A[i]);
	tree[1].a = 1, tree[1].b = N;
	build(1);
	for (i = 0; i < M; ++i) {
		scanf("%d%d%d", &cod, &t, &v);
		if (cod)
			printf("%d\n", search(t, v, 1));
			//search(t, v, 1);
		else
			add(1);
	}
	end = clock();
	printf("%d\n", end);
	return 0;
}