#include <iostream>
using namespace std;

template<typename Num>
class Val {
public:
	Val(Num value): firstvalue(value), value(value), state(0) {}
	operator Num() const { return value; }
	const Val operator - () const {
		switch(state){
		case 0: return Val(firstvalue, fkt(firstvalue), 1);
		case 1: return Val(firstvalue, 1 + firstvalue, 2);
		case 2: return Val(firstvalue, firstvalue > 0 ? firstvalue : -firstvalue, 3);
		case 3: return Val(firstvalue, - firstvalue, 4);
		case 4: return Val(firstvalue, firstvalue, 0);
		}
	}
private:
	Val(Num firstvalue, Num value, int state):
		firstvalue(firstvalue), value(value), state(state) {}
	
	static Num fkt(Num num) { return num > 0 ? num * fkt(num-1) : 1; }
		
	const Num firstvalue;
	Num value;
	int state;
};

int main() {
	Val<int> v(4);
	
	cout << v << " "
		<< -v << " "
		<< -(-v) << " "
		<< -(-(-v)) << " "
		<< -(-(-(-v))) << " "
		<< -(-(-(-(-v))));
	return 0;
}