Cod sursa(job #144030)

Utilizator azotlichidAdrian Vladu azotlichid Data 27 februarie 2008 03:09:02
Problema Nivele Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
using namespace std;

#define ALL(x) (x).begin(), (x).end()
#define CLEAR(X) (memset(X, 0, sizeof(X)))
#define FORI(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define FOR(i, N, M) for (int i = (int)(N); i <= (int)(M); ++i)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define SIZE(X) (int)((X).size())
#define TIPA(a, i) (cerr << #a << "[" #i " = " << (i) << "] = " << (a)[i] << endl)
#define TIP(x) (cerr << #x << " = " << (x) << endl)

#define MP make_pair
#define PB push_back
#define INF 0x3F3F3F3F

typedef long long LL;

#define NMAX 50005
int T, N, x, stk, st[NMAX];

#define PUSH(x) st[++stk] = (x);
#define POP     --stk;

void dumpst(void)
{
	fprintf(stderr, "[");
	FOR(i, 1, stk) fprintf(stderr, "%d ", st[i]); fprintf(stderr, "]\n");
}

int baga(void)
{
	scanf("%d", &N);
	stk = 0;
	scanf("%d", &x);

	if (x > N) return 0;

	FOR(i, 1, x-1) PUSH(i);
	FOR(i, 2, N) {
		scanf("%d", &x);
		if (x > N) return 0;
		if (stk == 0 || st[stk] >= x) return 0;
		int v = st[stk];
		POP;
		FOR(j, v+1, x-1) 
			PUSH(j);
	}

	return !stk;
}

int main(void)
{
    freopen("nivele.in", "r", stdin);
    freopen("nivele.out", "w", stdout);
	scanf("%d", &T);
	REP(tst, T)
		printf(baga() ? "DA\n" : "NU\n");
    return 0;
}