Cod sursa(job #584334)

Utilizator xaphariusMihai Suteu xapharius Data 25 aprilie 2011 00:44:20
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
//metoda naiva => modificare O(1), interogare O(n)
//metoda vector de sume => modificare O(n), interogate O(1)
// => pt interogari rapide + meodificari in timp real = arbori indexati binar => O(m*log(n))

#include "stdio.h"
#include "math.h"
#include <cstdlib>
using namespace std;

int N, M;
int *aib;

int getZeros(int x){
	int nr = 0;
	while (x % 2 == 0){
		x /= 2;
		++nr;
	}
	return nr;
}

void modifica(int index, int value){
	if (index > N + 1) return;

	aib[index] -= value;
	modifica(index + pow (2, getZeros(index)), value);
}

int interogheaza(int index1, int index2){
	if (index1 != 1) return interogheaza(1, index2) - interogheaza(1, index1 - 1);
	if (index2 <= 0) return 0;
	return aib[index2] + interogheaza(1, index2 - pow(2, getZeros(index2)));
}


int main(){

	FILE *in = fopen("datorii.in", "r");
	FILE *out = fopen("datorii.out", "w");

	fscanf(in, "%d %d", &N, &M);	
	aib = (int*)calloc(N + 1, sizeof(int));

	for (int i = 1, x; i < N + 1; ++i){
		fscanf(in, "%d", &x);
		modifica(i, -x);
	}

	for (int i = 0, cod, a, b; i < M; ++i){
		fscanf(in, "%d %d %d", &cod, &a, &b);
		if (cod == 0) modifica(a, b);
		else fprintf(out, "%d\n", interogheaza(a, b));
	}

	fclose(in);
	fclose(out);	
	return 0;
}