Cod sursa(job #137332)
Utilizator | dragus marius mariusdrg | Data | 17 februarie 2008 11:17:21 |
---|---|---|---|
Problema | Nivele | Scor | 0 |
Compilator | cpp | Status | done |
Runda | preONI 2008, Runda 4, Clasele 11-12 | Marime | 1.83 kb |
#include<stdio.h>
#include<set>
#define is insert
using namespace std;
const int maxn = 100000;
int st[maxn],dr[maxn];
int niv[maxn];
int nrt,N,i;
struct lstr
{
bool operator()(const int i,const int j)
{
return niv[i] > niv[j] || (niv[i] == niv[j] && i < j);
}
};
set <int,lstr> s;
int main()
{
freopen("nivele.in","r",stdin);
freopen("nivele.out","w",stdout);
scanf("%d",&nrt);
for(;nrt;--nrt)
{
memset(niv,0,sizeof(niv));
scanf("%d",&N);
for(i = 1;i <= N; ++i)
{
scanf("%d",&niv[i]);
dr[i] = i + 1;
s.is(i);
}
int nrnod = N - 1;
bool ver = 1;
while(nrnod)
{
--nrnod;
set <int,lstr> :: iterator it;
it = s.begin();
int nod = *it;
++it;
int nod2 = *it;
s.erase(s.find(nod));
s.erase(s.find(nod2));
if (niv[nod] != niv[nod2] || dr[nod] != nod2)
{
ver = 0;
printf("NU\n");
break;
}
dr[nod] = dr[nod2];
niv[nod]--;
s.insert(nod);
}
if (ver && niv[1] == 1)
{
printf("DA\n");
}
else
{
if (ver)printf("NU\n");
}
s.clear();
}
return 0;
}