Cod sursa(job #352)

Utilizator ZweisteinAdrian VELICU Zweistein Data 11 decembrie 2006 08:06:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <memory.h>
#define MAXARBELS 15001
long aib [MAXARBELS];
long n,m;
void Operare(long id, long vl) {
	long poz=id;
	while (poz<=n) {
		aib[poz]+=vl;
		poz+=poz^(poz-1)&poz;
	};
};
long InterogareSimpla(long panla) {
        if (panla==0) return 0;
		long sum=0;
		long poz=panla;
		while (poz) {
			sum+=aib[poz];
			poz-=poz^(poz-1)&poz;
		};
		return sum;  
};
long Interogare(long dela, long panla) {
	if (dela!=1) { return Interogare(1,panla)-Interogare(1,dela-1); }
	else {
		long sum=0;
		long poz=panla;
		while (poz) {
			sum+=aib[poz];
			poz-=poz^(poz-1)&poz;
		};
		return sum;
	};
};
void PrecomputeStuff(void) {
//	memset(p2,0,n*sizeof(long));
//	p2[0]=1; p2[1]=2;
	long i,poz;
//	for (i=2; i<=MAXPOW2; i++) { p2[i]=p2[i-1]*2; };
//	memset(c0,0,n*sizeof(long));
/*	for (i=1; i<=n; i++) {
		if (c0[i]==0) {
			if (c0[i+1]==0) c0[i+1]=1;
		} else {
			poz=i;
			while (poz<=n) {
				if (c0[poz+p2[c0[poz]]]==0) c0[poz+p2[c0[poz]]]=c0[poz]+1;
				poz+=p2[c0[poz]];
			};
		};
	};*/
/*	for (i=1; i<=n; i++) {
              c0[i]=i^(i-1)&i;
        };*/
//	for (i=1; i<=n; i++) {
//		if (p2[c0[i]]!=( ((i)&(i-1))^(i)  )) prlongf("error at %ld; %ld insteadof %ld\n",i,c0[i],((i)&(i-1)^(i)));
//	};
	memset(aib,0,n*sizeof(long));
};
int main (void) {
	FILE * fi=fopen("datorii.in","r");
	FILE * fo=fopen("datorii.out","w");
	fscanf(fi,"%ld %ld",&n,&m);
	long i,x;
	PrecomputeStuff();
	for (i=0; i<n; i++) {
		fscanf(fi,"%ld",&x);
		Operare(i+1,x);
	};
	long pa,pb;
	long op;
	for (i=0; i<m; i++) {
		fscanf(fi,"%ld %ld %ld",&op,&pa,&pb);
		if (op==0) {
			Operare(pa,-pb);
		} else {   
			fprintf(fo,"%ld\n",InterogareSimpla(pb)-InterogareSimpla(pa-1));
		};
	};
	fclose(fi); fclose(fo);
	return 0;
};