Cod sursa(job #534462)

Utilizator Addy.Adrian Draghici Addy. Data 15 februarie 2011 19:12:33
Problema Nivele Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <list>

using namespace std;

#define NMAX 50050

bool ok;
char S[3 * NMAX], *p;
int A[2 * NMAX], N, t, n, i, x, fr;
list <int> L;

int main () {
	
	freopen ("nivele.in", "r", stdin);
	freopen ("nivele.out", "w", stdout);
	
	scanf ("%d", &t);
	
	while (t--) {
		
		memset (A, 0, sizeof (A));
		
		scanf ("%d ", &n); 
		fgets (S, 3 * NMAX, stdin); p = S;
		
		N = 1, A[1] = 1, fr = 1, ok = 1;
		for (i = 1; i <= n; i++, p++) {
			x = 0;
			while (*p >= '0' && *p <= '9')
				x = x * 10 + (*p - '0'), p++;
			
			while (A[fr] < x) {
				N++;
				if (N > n) break;
				
				A[fr << 1] = A[(fr << 1) + 1] = A[fr] + 1;
				L.push_front ((fr << 1) + 1), L.push_front (fr << 1);
				fr = L.front (), L.pop_front ();
			}
			
			if (A[fr] > x || N > n) {
				ok = 0;
				break;
			}
			
			if (A[fr] == x)
				if (!L.empty ()) fr = L.front (), L.pop_front ();
		}
		
		if (ok) printf ("DA\n");
		else printf ("NU\n");
	}
	
	return 0;
}