Cod sursa(job #116372)

Utilizator scvalexAlexandru Scvortov scvalex Data 18 decembrie 2007 15:27:00
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

int N(0),
	M(0);
int bit[15001];
int mnem[15001];

int trailling_zeros(int n) {
	if (0 == n)
		return 0;

	if (mnem[n] != 0)
		return mnem[n];

	int r(0);

	for (int i(1); !(n & i); i <<= 1, ++r);

	return mnem[n] = r;
}

void bit_mod_value(int pos, int dif) {
	int i = pos;
	while (i <= N) {
		bit[i] += dif;
//		i += 1<<trailling_zeros(i);
		i += (i ^ (i-1)) & i;
	}
}

int bit_1range_value(int end) {
	if (end <= 0)
		return 0;

	int i = end;
	int r(0);
	while (i >= 1) {
		r += bit[i];
//		i -= 1<<trailling_zeros(i);
		i -= (i ^ (i-1)) & i;
	}

	return r;
}

int bit_interval_value(int p, int q) {
	return bit_1range_value(q) - bit_1range_value(p - 1);
}

int main(int argc, char *argv[]) {
	FILE *fin = fopen("datorii.in", "r");
	ofstream fout("datorii.out");
	fscanf(fin, "%d %d", &N, &M);
	int aux;
	for (int i(1); i <= N; ++i) {
		fscanf(fin, "%d", &aux);
//		bit_mod_value(i, aux);
		int j = i;
		while (j <= N) {
			bit[j] += aux;
//			i += 1<<trailling_zeros(i);
			j += (j ^ (j-1)) & j;
		}
	}

	int a(0),
		b(0),
		c(0);
	for (int i(0); i < M; ++i) {
		fscanf(fin, "%d %d %d", &c, &a, &b);
		if (1 == c) {
			fout << bit_interval_value(a, b) << endl;
		} else {
//			bit_mod_value(a, -b);
			b = -b;
			int j = a;
			while (j <= N) {
				bit[j] += b;
//				i += 1<<trailling_zeros(i);
				j += (j ^ (j-1)) & j;
			}
		}
	}

	fout.close();
	fclose(fin);

	return 0;
}