#include <stdio.h>
#include <vector>

using namespace std;

#pragma warning( disable: 4996 )
#pragma warning( error: 4717 )

template< class T > T Max( T a, T b ) { return a > b ? a : b; }
template< class T > void SwapValues( T& a, T& b )  { T temp( a ); a = b; b = temp; }

static const int MAX_SIZE = 1000000;

int maxCycles[ MAX_SIZE + 1 ];

int SequenceLength( unsigned int val ) {
	if ( val == 1 ) {
		return 1;
	}
	val = val % 2 != 0 ? val * 3 + 1 : val / 2;
	return SequenceLength( val ) + 1;
}

int main( int argc, char* argv[] ) {
#if 0
	vector< int > values;

	for ( int i = 1; i < MAX_SIZE + 1; i++ ) {
		int maxCycle = SequenceLength( i );
		
		if ( values.size() <= maxCycle ) {
			values.resize( maxCycle + 1, 0 );
		}

		values[ maxCycle ]++;
	}


	FILE* f = fopen( "histogram.csv", "w" );

	if ( f == NULL ) {
		return 0;
	}

	for ( int i = 0; i < values.size(); i++ ) {
		fprintf( f, "%i,%i\n", i, values[ i ] );
	}

	fclose( f );
#else
	vector< int > values;
	values.resize( 10, 0 );

	for ( int i = 1; i < MAX_SIZE + 1; i++ ) {
		int maxCycle = SequenceLength( i );

		char num[ 50 ];
		itoa( maxCycle, num, 10 );
		
		int index = 0;
		while ( num[ index ] != '\0' ) {
			values[ num[ index++ ] - '0' ]++;
		}
	}

	FILE* f = fopen( "histogram_digits.csv", "w" );

	if ( f == NULL ) {
		return 0;
	}

	for ( int i = 0; i < values.size(); i++ ) {
		fprintf( f, "%i,%i\n", i, values[ i ] );
	}

	fclose( f );
#endif

	return 0;
}
