Pagini recente » Cod sursa (job #1223489) | Cod sursa (job #286740) | Cod sursa (job #132215) | Cod sursa (job #462824) | Cod sursa (job #1691925)
#include<fstream>
#include<algorithm>
#include<string.h>
using namespace std;
ifstream in("secv.in");
ofstream out("secv.out");
#define MAX 5010
int v[MAX], l[MAX], D1[MAX],D2[MAX],E1[MAX], AIB[MAX], N;
void update(int x, int v,int D[])
{
for (;x <= N;x += x&(-x))
if (D[v] > D[AIB[x]])
AIB[x] = v;
}
int query(int x,int D[])
{
int mx = 0;
for (;x;x -= x&(-x))
if (D[AIB[x]] > D[mx])
mx = AIB[x];
return mx;
}
int main()
{
int i;
in >> N;
for (int i = 1;i <= N;++i)
{
in >> v[i];
l[i] = v[i];
}
sort(l + 1, l + N + 1);
int length = 1;
for (i = 2;i <= N;++i)
if (l[length] < l[i])
l[++length] = l[i];
for (i = 1;i <= N;++i)
v[i] = lower_bound(l + 1, l + length + 1, v[i]) - l;
for (i = 1;i <= N;++i)
{
D1[i] = D1[query(v[i] - 1, D1)] + 1;
update(v[i], i,D1);
}
for (i = N;i >= 1;--i)
{
D2[i] = D2[query(length - v[i], D2)] + 1;
update(length-v[i]+1, i, D2);
}
int len = 0;
int mn = 1 << 30;
for (int i = 1;i <= N;++i)
if (D1[i] == length)
l[++len] = i;
int j = 1;
i = 1;
while (i<=N && j <= len)
{
if(D2[i]==length)
mn = min(mn,l[j++]-i+1);
++i;
}
if (mn == (1 << 30))
out << -1;
else
out << mn;
return 0;
}