Cod sursa(job #2004243)

Utilizator workwork work work Data 25 iulie 2017 13:05:05
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#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;
stack<int> st1;
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 && st.size() == N)
        {
            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;
    st1.push(v[1]);
    s[v[1]] = 1;
    p = 1;u = 1;
    s = 0;
    for(int i = 2; i <= n; i++)
    {
        if(!s[v[i]] && st1.top() < v[i])
           s[v[i]] = 1, st1.push(v[i]),  u = i;
        else if(s[v[i]] == 0)
        {
            while(!st1.empty() && st1.top() > v[i])
                s[st1.top()] = 0, st1.pop();
            if(st1.empty()) u = i;
            p = i;
            st1.push(v[i]); s[v[i]] = 1;
        }
        else if(v[i] == maxx && st1.size() == N)
        {
            if(u - p +1 < su - sp +1 && st1.size() == N)
                sp = p, su = u;
            while(!st1.empty())
                s[st1.top()] = 0, st1.pop();
            u = i;
            p = i;
            st1.push(v[i]); s[v[i]] = 1;
        }
    }
    if(u - p +1 < su - sp +1 && st1.size() == N) sp = p, su = u;
    if(st.size() == N || st1.size())
    {
        fprintf(G, "%d", su-sp+1);
        return 0;
    }
    fprintf(G, "%d", -1);
    return 0;
}