Cod sursa(job #1691889)

Utilizator ArkinyStoica Alex Arkiny Data 19 aprilie 2016 18:16:51
Problema Secv Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#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], up[MAX], AIB[MAX], O[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];
		O[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)
	{
		up[i] = query(v[i] - 1,D1);
		D1[i] = D1[up[i]] + 1;
		update(v[i], i,D1);
	}
	memset(AIB, 0, sizeof(AIB));

	for (i = N;i >= 1;--i)
	{
		up[i] = query(N-v[i], D2);
		D2[i] = D2[up[i]] + 1;
		update(N-v[i]+1, i, D2);
	}
	for (int i = N;i >= 1;--i)
		(D1[i] == length) ? E1[i] = i : E1[i] = E1[i+1];

	int mn = 1 << 30;
	for (int i = 1;i <= N;++i)
		if (E1[i] && D2[i]==length)
			mn = min(mn,E1[i] - i + 1);

	if (mn == (1 << 30))
		out << -1;
	else
		out << mn;

	return 0;
}