Cod sursa(job #137741)

Utilizator blasterzMircea Dima blasterz Data 17 februarie 2008 14:14:54
Problema Nivele Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <string>
#include <cstdlib>
#define maxn 50001

int a[maxn],n;
int nd,Nd;
int N,poz;
bool use[2*maxn];
//char ax[600001];
inline void dfs(unsigned short n, unsigned short k)
{
    use[n]=1;
    unsigned short p=0;
    
    if(poz==Nd+1) return;
    if(a[poz]==k) {++poz;return;}

    if(a[poz]>k)
    {
	N+=2;
	p=N;
    dfs(N-1, k+1);
    }

     if(p!=0)
   	dfs(p, k+1);
   

}

void solve()
{
    N=1;
    poz=1;
    memset(use,0, sizeof(use));
    dfs(1,1);
    int ok=1;
    int NN=2*n-1;
    for(int i=1;i<=NN;++i)if(!use[i]) { ok=0;break;}
 //   for(int i=1;i<=NN;++i) printf("%d ", use[i]);
    if(ok && poz==n+1 && N==nd )printf("DA\n");
    else printf("NU\n");

}


int main()
{
    int T,i;
    freopen("nivele.in","r",stdin);
    freopen("nivele.out","w",stdout);
    scanf("%d\n", &T);
    while(T--)
    {
/*
		gets(ax);
	char *t=strtok(ax, " ");
	n=atoi(t);
	for(i=1;i<=n;++i) 
	{
	    t=strtok(0," ");
	    a[i]=atoi(t);
	}
*/
	scanf("%d ", &n);
	for(i=1;i<=n;++i) scanf("%d ", a+i);
	nd=2*n-1;
	Nd=n;
	solve();
  //  for(i=1;i<=n;++i)printf("%d ", a[i]);
   // printf("\n");
    }
    return 0;
}