Pagini recente » Cod sursa (job #2884577) | Cod sursa (job #2676955) | Cod sursa (job #1543582) | Cod sursa (job #1647391) | Cod sursa (job #2631126)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv.in");
ofstream fout("secv.out");
const int nmax = 5000;
int n, v[nmax + 5], nextt[nmax + 5];
vector <int> p[nmax + 5];
struct elem
{
int val, poz;
}v2[nmax + 5];
bool cmp(elem a, elem b)
{
if (a.val == b.val)
{
return a.poz < b.poz;
}
return a.val < b.val;
}
int main()
{
fin >> n;
if (n == 0)
{
fout << -1;
return 0;
}
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
v2[i] = {v[i], i};
}
sort(v2 + 1, v2 + n + 1, cmp);
int z = 0;
for (int i = 1; i <= n; ++i)
{
if (i == 1) ++z;
else if (v2[i].val > v2[i - 1].val) ++z;
v[v2[i].poz] = z;
p[z].push_back(v2[i].poz);
}
for (int i = 1; i <= n; ++i)
{
if (v[i] == z) nextt[i] = i;
}
int minim = nmax + 5;
for (int i = z - 1; i >= 1; --i)
{
for (auto pos : p[i])
{
int st = 0, dr = p[i + 1].size() - 1, ans = -1;
while (st <= dr)
{
int mid = (st + dr) / 2;
if (p[i + 1][mid] > pos)
{
ans = p[i + 1][mid];
dr = mid - 1;
}
else
{
st = mid + 1;
}
}
if (ans == -1) nextt[pos] = ans;
else nextt[pos] = nextt[ans];
}
}
for (int i = 1; i <= n; ++i)
{
if (v[i] == 1)
{
if (nextt[i] != -1)
{
minim = min(minim, nextt[i] - i + 1);
}
}
}
if (minim == nmax + 5) minim = -1;
fout << minim;
fin.close();
fout.close();
return 0;
}