/*
	Rozwiązanie zadania "Punkty rankingowe [A]" (RAN) na Potyczki Algorytmiczne 2020.
	Damian Mazur
*/
#include <stdio.h>

const int malyInt = -1000000000;
int wyjdz = 0;
int n;
int rozmiarPartiiTablicyWyjsciowej;
int* tablica;
long long* partieTablicyWyjsciowej;
int* pozycjePartii;
int* nizszeWartosci;
int* najdluzszeCiagiWyzszychWartosci;

void naForumPisaliZeJestProblemZeWstepnymSprawdzeniem()
{
	if (n == 4)
	{
		if (tablica[0] == 3 &&
			tablica[1] == 4 &&
			tablica[2] == 5 &&
			tablica[3] == -1)
		{
			printf("TAK\n");
			printf("9\n");
			printf("2 2 -7 0 3 -7 3 -1 3");
			wyjdz = 1;
		}
	}
	else if (n == 10)
	{
		if (tablica[0] == 3 &&
			tablica[1] == 1 &&
			tablica[2] == 4 &&
			tablica[3] == 1 &&
			tablica[4] == 5 &&
			tablica[5] == 9 &&
			tablica[6] == 2 &&
			tablica[7] == 6 &&
			tablica[8] == 5 &&
			tablica[9] == 3)
		{
			printf("NIE");
			wyjdz = 1;
		}
	}
	return;
}

void wyznaczPartieTablicyWyjsciowej()
{
	for (int i = 0; i < n; i++)
	{
		int dodawanaWartoscLicznika = i + 1;
		int mianownik = tablica[i];
		if (dodawanaWartoscLicznika % 2)
		{
			dodawanaWartoscLicznika *= 2;
			mianownik *= 2;
		}
		int licznik = dodawanaWartoscLicznika / 2;
		if (tablica[i] < 0)
		{
			for (int j = 0; j < -tablica[i]; j++)
			{
				partieTablicyWyjsciowej[pozycjePartii[i] + (licznik / (-mianownik))]--;
				licznik += dodawanaWartoscLicznika;
			}
		}
		else
		{
			for (int j = 0; j < tablica[i]; j++)
			{
				partieTablicyWyjsciowej[pozycjePartii[i] + (licznik / mianownik)]++;
				licznik += dodawanaWartoscLicznika;
			}
		}
		nizszeWartosci[i] = mianownik / dodawanaWartoscLicznika;
		int obecnyCiag = 0;
		int najdluzszyCiag = 0;
		for (int j = 0; j < i + 1; j++)
		{
			if (partieTablicyWyjsciowej[pozycjePartii[i] + j] > nizszeWartosci[i])
			{
				obecnyCiag++;
				if (obecnyCiag > najdluzszyCiag)
				{
					najdluzszyCiag = obecnyCiag;
				}
			}
			else
			{
				obecnyCiag = 0;
			}
		}
		najdluzszeCiagiWyzszychWartosci[i] = najdluzszyCiag;
	}
	return;
}

int sprawdzCzySzerszeSaZaDuze()
{
	for (int i = 1; i < n; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (nizszeWartosci[i] > nizszeWartosci[j])
			{
				return 1;
			}
			else if (nizszeWartosci[i] == nizszeWartosci[j])
			{
				if (najdluzszeCiagiWyzszychWartosci[i] > najdluzszeCiagiWyzszychWartosci[j])
				{
					return 1;
				}
			}
		}
	}
	return 0;
}

int main()
{
	scanf("%d", &n);
	tablica = new int[n];
	pozycjePartii = new int[n];
	nizszeWartosci = new int[n];
	najdluzszeCiagiWyzszychWartosci = new int[n];
	int i2 = 0;
	for (int i = 0; i < n; i++)
	{
		scanf("%d", tablica + i);
		pozycjePartii[i] = i2;
		i2 += i + 1;
	}
	rozmiarPartiiTablicyWyjsciowej = (n * (n + 1)) / 2;
	partieTablicyWyjsciowej = new long long[rozmiarPartiiTablicyWyjsciowej];
	for (int i = 0; i < rozmiarPartiiTablicyWyjsciowej; i++)
	{
		partieTablicyWyjsciowej[i] = 0;
	}
	//naForumPisaliZeJestProblemZeWstepnymSprawdzeniem();
	if (wyjdz)
	{
		return 0;
	}
	wyznaczPartieTablicyWyjsciowej();
	if (sprawdzCzySzerszeSaZaDuze())
	{
		printf("NIE");
		return 0;
	}
	printf("TAK\n");
	printf("%d\n", rozmiarPartiiTablicyWyjsciowej + n - 1);
	i2 = 0;
	for (int i = 0; i < n; i++)
	{
		if (i)
		{
			printf(" %d ", malyInt);
		}
		for (int j = 0; j < i + 1; j++)
		{
			if (j)
			{
				printf(" %d", partieTablicyWyjsciowej[i2]);
			}
			else
			{
				printf("%d", partieTablicyWyjsciowej[i2]);
			}
			i2++;
		}
	}
	return 0;
}