Pagini recente » Cod sursa (job #256743) | Cod sursa (job #1280337) | Cod sursa (job #1024936) | Cod sursa (job #2341874) | Cod sursa (job #2004221)
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
FILE *F = fopen("secv.in", "r"), *G = fopen("secv.out", "w");
stack<int> st;
int L, R, M, N, u, p, n, fr[5001], v[5001], x[5001], maxx, su = 6000, sp = 0;
bitset<5001> s;
int main()
{
fscanf(F, "%d ", &n);
for(int i = 1; i <= n; ++ i)
{
fscanf(F, "%d ", &v[i]);
x[i] = v[i];
}
sort(x + 1, x + n + 1);
for(int i = 1; i <= n; ++ i)
{
L = 1;
R = n;
while(L <= R)
{
M =(L + R)/2;
if(x[M] < v[i]) L = M+1;
else R = M - 1;
}
v[i] = L;
if(!fr[v[i]])
{
fr[v[i]] = 1;
N++;
if(v[i] > maxx) maxx = v[i];
}
}
st.push(v[n]);
s[v[n]] = 1;
p = n;u = n;
for(int i = n - 1; i > 0; i--)
{
if(!s[v[i]] && st.top() > v[i])
s[v[i]] = 1, st.push(v[i]), p = i;
else if(s[v[i]] == 0)
{
while(!st.empty() && st.top() < v[i])
s[st.top()] = 0, st.pop();
if(st.empty()) u = i;
p = i;
st.push(v[i]); s[v[i]] = 1;
}
else if(v[i] == maxx)
{
if(u - p +1 < su - sp +1 && st.size() == N)
sp = p, su = u;
while(!st.empty())
s[st.top()] = 0, st.pop();
u = i;
p = i;
st.push(v[i]); s[v[i]] = 1;
}
}
if(u - p +1 < su - sp +1 && st.size() == N) sp = p, su = u;
if(st.size() == N)
{
fprintf(G, "%d", su-sp+1);
return 0;
}
fprintf(G, "%d", -1);
return 0;
}