Cod sursa(job #137205)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 17 februarie 2008 10:15:24
Problema Nivele Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.11 kb
#include <stdio.h>

#define NMAX 50100

int niv[NMAX];
char tip[NMAX];
int i, j, k, N, T, cnt, stktop, ok;

int main()
{
	freopen("nivele.in", "r", stdin);
	freopen("nivele.out", "w", stdout);

	scanf("%d", &T);

	while (T--)
	{
		scanf("%d", &N);
		for (i = 1; i <= N; i++)
			scanf("%d", &niv[i]);

		if (N == 1 && niv[1] == 1)
		{
			// special case: unclear which is the answer (can the root be a leaf ?)
			printf("DA\n");
			continue;
		}

		cnt = 1;
		stktop = 1;
		tip[stktop] = 1;

		for (ok = i = 1; i <= N && ok; i++)
		{
			if (niv[i] <= stktop || stktop <= 0)
			{
				ok = 0;
				break;
			}

			while (stktop < niv[i] - 1)
			{
				stktop++;
				tip[stktop] = 1;
				cnt++;

				if (cnt >= N)
				{
					ok = 0;
					break;
				}
			}

			if (!ok)
				break;

			if (tip[stktop] == 1)
				tip[stktop] = 2;
			else
			{
				while (stktop > 0 && tip[stktop] == 2)
					stktop--;

				if (stktop > 0)
					tip[stktop] = 2;
			}
		}

		if (cnt != N - 1 || stktop != 0)
			ok = 0;

		if (ok)
			printf("DA\n");
		else
			printf("NU\n");
	}

	return 0;
}