Cod sursa(job #2455215)

Utilizator IliesiDanielDaniel IliesiDaniel Data 10 septembrie 2019 22:34:00
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
// ============================================================================

#include <iostream>
#include <fstream>

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

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

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

using namespace std;

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

ofstream 	fout 	("datorii.out");
ifstream 	fin 	("datorii.in");

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

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)
{
	// ------------------------------------------------------------------------

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

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

	fin >> n >> m;

	for (zi = 1; zi <= n; zi++)
	{
		fin >> suma;

		adauga_datorie (zi, suma);
	}

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

	for (int operatiune = 0; operatiune < m; operatiune++)
	{
		fin >> tip;

		if (tip == false)
		{
			fin >> zi >> suma;

			plata (zi, suma);
		}
		else
		{
			fin >> zis >> zif;

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

			fout << suma << endl;
		}
	}

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

	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;
}

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