/*
Név: Kis Lázár Bence
Iskola: Magyar Tanítási Nyelvű Magángimnázium
Helység: Dunaszerdahely
Osztály: 11.

Fejlesztői környezet: Microsoft Visual Studio 2015
*/

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

using namespace std;

//-----------------------//
//       KONSTANSOK      //
//-----------------------//

const string fLoc = "kockak.txt";

//-----------------------//
//       OSZTALYOK       //
//-----------------------//

class col {
public:
	int cubeNum;			// kockak szama az oszlopban
	int cubes[1000];		// az egyes kockak oldalhossza
	int height = 0;			// az oszlop magassaga
	int sameNum = 0;		// azonos elhosszusagu kockak szama
};

//-----------------------//
//       FUNKCIOK        //
//-----------------------//


//-----------------------//
//   GLOBALIS VALTOZOK   //
//-----------------------//

int k = 0;				// kockak szama osszesen
ifstream f;
col cols[1000];			// oszlopok
int colNum = 0;			// oszlopok szama

//-----------------------//
//       FO PROGRAM      //
//-----------------------//

int main(int argc, char* argv[]) {
	f.open(fLoc, ios::in);
	f >> k;			// kockak szamanak beolvasasa

	if (k > 0) {			// van kocka
		int current = 0;		// az epp beolvasott kocka merete
		for (int i = 0; i < k; i++) {
			f >> current;

			int j = 0;
			if (colNum) {		// ha mar van oszlop, akkor megkeresi, melyikre fer ra
				while ((current > cols[j].cubes[cols[j].cubeNum - 1]) && (j < colNum))
					j++;
			}

			cols[j].cubes[cols[j].cubeNum] = current;
			cols[j].cubeNum++;
			if (j == colNum)
				colNum++;
		}

		cout << "2. feladat: " << colNum << " torony" << endl;


		//       3. FELADAT      //

		for (int i = 0; i < colNum; i++)
			for (int q = 0; q < cols[i].cubeNum; q++)
				cols[i].height += cols[i].cubes[q];

		int highest = 0;		// legmagasabb torony sorszama
		for (int i = 1; i < colNum; i++)
			if (cols[i].height > cols[highest].height)
				highest = i;

		cout << "3. feladat: ";
		for (int i = 0; i < cols[highest].cubeNum; i++)
			cout << cols[highest].cubes[i] << " ";
		cout << cols[highest].height << endl;


		//       4. FELADAT      //

		for (int i = 0; i < colNum; i++) {
			int occurence = 1;		// az azonos elhosszusagu kockak elofordulasanak szamat tarolja
			for (int q = 1; q < cols[i].cubeNum; q++) {
				if (cols[i].cubes[q] == cols[i].cubes[q - 1]) {
					occurence++;
					if (occurence > cols[i].sameNum)
						cols[i].sameNum = occurence;
				}
				else
					occurence = 1;
			}
		}

		int maxOccur = 0;		// legtobb azonos elhosszusago kockat tartalmazo oszlop indexe
		for (int i = 1; i < colNum; i++)
			if (cols[i].sameNum > cols[maxOccur].sameNum)
				maxOccur = i;

		cout << "4. feladat: " << maxOccur + 1 << endl;


		//       5. FELADAT      //

		int regularNum = 0;		// szabalyos tornyok szama
		for (int i = 0; i < colNum; i++)
			if (cols[i].cubeNum >= 3) {			// legalabb 3 kocka
				bool regular = true;			// szabalyos oszlop?
				const int difference = cols[i].cubes[0] - cols[i].cubes[1];
				for (int q = 2; q < cols[i].cubeNum; q++)
					if (cols[i].cubes[q - 1] - cols[i].cubes[q] != difference) {
						regular = false;
						break;
					}
				if (regular)
					regularNum++;
			}

		cout << "5. feladat: " << regularNum << endl;


		//       6. FELADAT      //

		int colIndex = -1;
		cout << "6. feladat: Torony sorszama: ";
		cin >> colIndex;
		while (colIndex < 1 || colIndex > colNum) {
			cout << "Helytelen sorszam. Uj sorszam: ";
			cin >> colIndex;
		}
		colIndex--;			// 0-val kezdodo szamozas miatt

		int colored = 5 * pow(cols[colIndex].cubes[0], 2);
		int white = pow(cols[colIndex].cubes[0], 2);
		for (int i = 1; i < cols[colIndex].cubeNum; i++) {
			colored += 4 * pow(cols[colIndex].cubes[i], 2);
			white += 2 * pow(cols[colIndex].cubes[i], 2);
		}
		cout << "a. " << colored << endl << "b. " << white << endl;


		//       7. FELADAT      //

		cout << "7. feladat: ";
		if (colNum > 1) {
			int movable = 0;		// atrakhato kockak szama
			int i = cols[0].cubeNum - 1;
			if (colNum > 1)
				while (cols[0].cubes[i] <= cols[colNum - 1].cubes[cols[colNum - 1].cubeNum - 1] && i >= 0) {
					movable++;
					i--;
				}
			cout << movable << endl;
		}
		else
			cout << "csak egy oszlop van" << endl;
	}

	return 0;
}
