Cod sursa(job #247662)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 23 ianuarie 2009 17:53:48
Problema Secv Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#define pr 666013

struct nod
{
int x;
nod *urm;
};
nod *W[pr];

void add(int p)
{
nod *q;
q = W[p%pr];
bool ok=1;
while (q!=NULL && ok)
if (q->x==p) ok=0;
else q=q->urm;
if (ok)
{
q = new nod;
q->x = p;
q->urm = W[p%pr];
W[p%pr] = q;
//printf("%d\n",p);
}
}
void del(int p)
{
nod *q;
bool ok=1;
q = W[p%pr];
if (q->x==p) W[p%pr]=W[p%pr]->urm,ok=0;
while (ok)
{
if (q->urm->x==p) ok=0,q=q->urm->urm;
else q = q->urm;
}
}

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

int n,i,j,A[5001],l[5001],max;
scanf("%d\n",&n);
for (i=1;i<=n;i++) scanf("%d",&A[i]),add(A[i]);

l[n]=1,max = n;
for (i=n-1;i;i--)
{
l[i] = 1;
for (j=i+1;j<=n;j++) if (A[i]<A[j]) if (l[i]<=l[j]) l[i] = l[j]+1;
if (l[max]<l[i]) max=i;
}
int x=l[max];
i=max;
del(A[i]);
x--;
while (x)
{
while (l[i]!=x) i++;
del(A[i]);
x--;
}
for (j=1;j<=n;j++) if (W[A[j]%pr]!=NULL) {j=-1;break;}
//for (j=1;j<=n;j++) printf("%d ",l[j]);
if (j==-1) printf("-1");
else printf("%d",i-max+1);
}