Pagini recente » Utilizatori inregistrati la Infoarena Monthly 2012 - Runda 1 | Cod sursa (job #3284512) | Cod sursa (job #707211) | Cod sursa (job #2764772) | Cod sursa (job #4095)
Cod sursa(job #4095)
#include<cstdio>
#define dim 5001
int N, M, L[dim], P[dim], S[dim], SOL; long A[dim], B[dim];
void read()
{
freopen("secv.in", "r", stdin);
scanf("%d", &N);
int i;
for(i=1; i<=N; ++i)
scanf("%ld", A + i);
}
void swap(int i, int j)
{ B[i] ^= B[j] ^= B[i] ^= B[j];
}
void heapUP(int k)
{
if(k <= 1)
return;
int t = k / 2;
if(B[t] < B[k])
{
swap(t, k);
heapUP(t);
}
}
void buildH()
{
int i;
for(i=2; i<=N; ++i)
heapUP(i);
}
void restoreH(int r, int b)
{
long st, dr, max;
if(r << 1 <= b)
{
st = B[r<<1];
if((r << 1) + 1 <= b)
dr = B[(r<<1)+1];
else
dr = st - 1;
max = st > dr ? r << 1 : (r << 1) + 1;
if(B[r] < B[max])
{
swap(max, r);
restoreH(max, b);
}
}
}
void heapsort()
{
int i;
for(i=N; i>1;)
{
swap(1, i);
restoreH(1, --i);
}
}
void copy()
{
int i;
for(i=1; i<=N; ++i)
B[i] = A[i];
}
int b_search(long value)
{
int st = 1, dr = M, m;
while(st <= dr)
{
m = (st + dr) >> 1;
if(B[m] == value)
return value;
else
{
if(value < B[m])
dr = m - 1;
if(value > B[m])
st = m + 1;
}
}
}
void dynamics()
{
int i, j, poz, p; L[1] = 1, P[1] = 0, S[1] = 1;
for(i=2; i<=N; ++i)
{
poz = b_search(A[i]);
p = 0;
for(j=1; j<i; ++j)
if(L[j] == poz - 1 && S[j] > S[p] && A[j] == B[poz-1])
p = j;
L[i] = L[p] + 1; P[i] = p; S[i] = p != 0 ? S[p] : i;
if(L[i] == M && (i - S[i] + 1) > SOL)
SOL = (i - S[i] + 1);
}
}
void c_array()
{
int x = B[1], i; M = 1;
for(i=2; i<=N; ++i)
if(B[i] != x)
{
B[++M] = B[i];
x = B[i];
}
}
int main()
{
read(); copy();
buildH(); heapsort();
c_array(); dynamics();
freopen("secv.out", "w", stdout);
printf("%d", SOL !=0 ? SOL : -1);
fclose(stdin); fclose(stdout);
return 0;
}