Pagini recente » Cod sursa (job #174866) | Cod sursa (job #1731032) | Cod sursa (job #904583) | Cod sursa (job #1237147) | Cod sursa (job #2277299)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <vector>
#define maxn 5005
using namespace std;
int N;
//int v[maxn];
//int best[maxn];
//int pos[maxn];
int nr_diff = 0;
set <int> aparitii;
vector <int> siruri;
vector <pair<int, int> > a, d(maxn); ///d[i] - ultimul element al lisului cu i elemente;
int lis;
int prv[maxn];
int cautbin(int nr, int b, int e)
{
int mid = (b + e)/2;
while(b < e)
{
mid = (b + e)/2;
if(d[mid].first >= nr)
e = mid;
else
b = mid + 1;
}
return b;
}
int main()
{
ifstream in ("secv.in");
ofstream out ("secv.out");
int lgmin = 0x7fffffff;
in>>N;
a.push_back({0, 0}); //dummy ca sa inceapa de al 1
for(int i = 1; i <= N; ++i)
{
int cv;
in>>cv;
a.push_back({cv, i});
//cout<<a[i].first<<" ";
if(aparitii.find(a[i].first) == aparitii.end())
{
++nr_diff;
aparitii.insert(a[i].first);
}
}
if(nr_diff == 1)
{
out<<"1\n";
return 0;
}
/*for(int i = 0; i <= N; ++i)
{
best[i] = 1;
pos[i] = -1;
}
for(int i = N - 1; i > 0; --i)
{
for(int j = i + 1; j <= N; ++j)
if(v[i] < v[j] && best[i]<best[j]+1)
{
best[i] = best[j] + 1;
pos[i] = j;
if(best[i] == nr_diff)
{
siruri.push_back(i);
//cout<<i<<"\n";
}
}
}*/
lis = 1; ///lungimea maxima a subsirului
d[lis] = a[1];
for (int i = 2; i <= N; ++i)
{
if(a[i].first > d[lis].first)
{
++lis;
d[lis] = a[i];
prv[a[i].second] = d[lis-1].second;
if(lis == nr_diff)
siruri.push_back(i);
}
else
{
int lo = cautbin(a[i].first, 1, lis);
d[lo] = a[i];
prv[a[i].second] = d[lo-1].second;
if(lo == nr_diff)
siruri.push_back(i);
}
}
if(siruri.empty())
{
out<<"-1\n";
return 0;
}
//cout<<"AFIS!";
for(int i = 0; i < siruri.size(); ++i)
{
int capat = siruri[i];
while(1)
{
//cout<<capat<<"\n";
if(prv[capat])
capat = prv[capat];
else
break;
}
;
if(siruri[i] - capat < lgmin)
lgmin = siruri[i] - capat;
}
out<<lgmin + 1<<"\n";
return 0;
}