Cod sursa(job #247666)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 23 ianuarie 2009 18:04:11
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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;}

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