Uvećaj sve elemente skupa

Napisati generičku klasu mapa<K, V> koja implementira mapu parova tipa std::pair<K, V>. Klasa treba da podržava sledeće operacije:

Sve operacije treba da budu složenosti ne veće od $O(\log n)$.

Ulaz

Sa standardnog ulaza, sve do kraja ulaza, učitavaju se naredbe u formatu:

Izlaz

Na standardni izlaz ispisati rezultate izvršavanja naredbi v k. Ako neka naredba baci izuzetak, ispisati poruku izuzetka na standardni izlaz za greške.

Primer

stdin

a 1 10
a 2 20
v 1
i 5
v 2
u 1 3
v 1
r 2
v 2

stdout

10
25
18

stderr

Kljuc nije pronadjen

Rešenje

main.cpp

#include <iostream>
#include <map>
 
namespace matf 
{
	/* Klasa za mapu sa uvecavanjem svih vrednosti */
	template <typename K, typename V>
	class mapa
	{
		public:
			/* Dodaje par (key, value) u mapu */
			void dodaj(const K& key, const V& value) 
			{
				elementi[key] = value - uvecanje;
			}

			/* Vraca vrednost za dati kljuc */
			V vrednost(const K& key) const
			{
				auto it = elementi.find(key);
				if (it == elementi.end()) {
					throw std::out_of_range("Kljuc nije pronadjen u mapi");
				}

				return it->second + uvecanje;
			}

			/* Uvecava sve vrednosti za delta */
			void uvecaj_sve(const V& delta)
			{
				uvecanje += delta;
			}

			/* Uvecava vrednost za dati kljuc za inc */
			void uvecaj(const K& key, const V& delta)
			{
				auto it = elementi.find(key);
				if (it == elementi.end()) {
					throw std::out_of_range("Kljuc nije pronadjen u mapi");
				}

				it->second += delta;
			}

			/* Uklanja par sa datim kljucem */
			void ukloni(const K& key)
			{
				elementi.erase(key);
			}
			
		private:
			std::map<K, V> elementi;
			V uvecanje = 0;
	};
};

int main(void)
{
	matf::mapa<int, int> m;

	char op;

	while (std::cin >> op) {
		if (op == 'a') {
			int k, v; std::cin >> k >> v;
			m.dodaj(k, v);
		} else if (op == 'v') {
			int k; std::cin >> k;
			try {
				int v = m.vrednost(k);
				std::cout << v << std::endl;
			} catch (const std::out_of_range& e) {
				std::cerr << e.what() << std::endl;
			}
		} else if (op == 'u') {
			int k, delta; std::cin >> k >> delta;
			m.uvecaj(k, delta);
		} else if (op == 'i') {
			int delta; std::cin >> delta;
			m.uvecaj_sve(delta);
		} else if (op == 'r') {
			int k; std::cin >> k;
			m.ukloni(k);
		}
	}

	return 0;
}