Cod sursa(job #2455229)

Utilizator IliesiDanielDaniel IliesiDaniel Data 10 septembrie 2019 23:50:42
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
// ============================================================================

#include <stdio.h>

// ============================================================================

#define zeros(x) 	((x^(x-1))&x)

// ============================================================================

using namespace std;

// ============================================================================

void	adauga_datorie (int zi, int datorie);
void	plata (int zi, int suma);

int 	rest_plata (int zis);

// ============================================================================

int 			datorii [15002];
int 			n, m;

// ============================================================================

int 	main (void)
{
	// ------------------------------------------------------------------------

	int 			tip;
	int 			zi, suma;
	int 			zis, zif;

	FILE 			*input;
	FILE 			*output;

	// ------------------------------------------------------------------------
	// Initial file read.

	input = fopen ("datorii.in", "r");
	output = fopen ("datorii.out", "w");

	fscanf (input, "%d %d", &n, &m);

	for (zi = 1; zi <= n; zi++)
	{
		fscanf (input, "%d", &suma);

		adauga_datorie (zi, suma);
	}

	// ------------------------------------------------------------------------
	// Reading and processing the rest of the file.

	while (m--)
	{
		fscanf (input, "%d ", &tip);

		if (tip == false)
		{
			fscanf (input, "%d %d", &zi, &suma);

			plata (zi, suma);
		}
		else
		{
			fscanf (input, "%d %d", &zis, &zif);

			suma = rest_plata (zif) - rest_plata (zis - 1);

			fprintf(output, "%d\n", suma);
		}
	}

	// ------------------------------------------------------------------------

	fclose (input);
	fclose (output);

	// ------------------------------------------------------------------------

	return 0;
}

// ============================================================================

void	adauga_datorie (int zi, int datorie)
{
	for (int i = zi; i <= n; i += zeros (i))
	{
		datorii [i] += datorie;
	}
}

// ============================================================================

void	plata (int zi, int suma)
{
	for (int i = zi; i <= n; i += zeros (i))
	{
		datorii [i] -= suma;
	}
}

// ============================================================================

int 	rest_plata (int zi_start)
{
	int plata = 0;

	for (int zi = zi_start; zi > 0; zi -= zeros (zi))
	{
		plata += datorii [zi];
	}

	return plata;
}

// ============================================================================