Cod sursa(job #2004209)

Utilizator workwork work work Data 25 iulie 2017 11:45:39
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 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;
int  L, R, M, N, u, p, n, fr[5001], v[5001], x[5001];
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++;
        }
    }
    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(st.size() == 1 && v[i] == st.top()) u = i, p = i;
    }
    if(st.size() == N)
    {
        fprintf(G, "%d", u-p+1);
        return 0;
    }
    fprintf(G, "%d", -1);
    return 0;
}