Cod sursa(job #371488)

Utilizator c912046Mihaila Stefan c912046 Data 5 decembrie 2009 15:40:17
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <cmath>

int main ()
{
	std::ifstream f_in("datorii.in");
	std::ofstream f_out("datorii.out");
	
	unsigned int N, M, vect[15000], buckets[123], i;
	
	f_in >> N >> M;
	memset(buckets, 0, sizeof(buckets));
	
	unsigned int bucketsize = static_cast<unsigned int>(std::sqrt(N));
	
	for (i=0; i<N; ++i) { f_in >> vect[i]; buckets[i/bucketsize] += vect[i]; }
	
	for (i=0; i<M; ++i) {
		unsigned int op, a, b;
		f_in >> op >> a >> b;
		switch (op) {
		case 0:
			--a;
			vect[a] -= b;
			buckets[a/bucketsize] -= b;
			break;
		case 1:
			--a; --b;
			unsigned int startbucket = a/bucketsize, endbucket = b/bucketsize;
			bool before=false, after=false, in = true;
			unsigned int sum=0;
			if (a%bucketsize != 0) { before = true; ++startbucket; }
			if (b%bucketsize != bucketsize-1) {
				after = true;
				if (endbucket > 0) --endbucket;
				else in = false;
			}
			unsigned int j,k;
			if (before) {
				k = startbucket * bucketsize;
				for (j=a; j<k; ++j) sum += vect[j];
			}
			if (in) for (j=startbucket; j<=endbucket; ++j) sum += buckets[j];
			if (after) {
				for (j=endbucket*bucketsize+1; j<=b; ++j) sum += vect[j];
			}
			f_out << sum << '\n';
			break;
		}
	}
	
	f_in.close();
	f_out.close();
	return 0;
}