Cod sursa(job #2004187)

Utilizator infomaxInfomax infomax Data 25 iulie 2017 11:23:14
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 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");

int u, p, n, v[5001], w[5001], k;
bitset<5001> c;
bitset<5001> f;
stack<int> st;

int main()
{
    fscanf(F, "%d ", &n);
    for(int i = 1; i <= n; ++ i) fscanf(F, "%d ", &v[i]), w[i] = v[i];
    sort(w+1, w+n+1);
    int l, r, mij;
    for(int i = 1; i <=n; ++ i)
    {
        l = 1; r = n;
        while(l <= r)
        {
            mij = (l+r)>>1;
            if(w[mij] >= v[i]) r = mij - 1;
            else l = mij+1;
        }
        v[i] = l;
        if(!f[v[i]]) f[v[i]] = 1, ++k;
    }
    st.push(v[n]); c[v[n]] = 1; u =n; p = n;
    for(int i = n-1; i; i--)
    {
        if(v[i] < st.top() && !c[v[i]])
            st.push(v[i]), c[v[i]] = 1, p = i;
        else if(!c[v[i]])
        {
            while(!st.empty() && v[i] > st.top())
                c[st.top()] = 0, st.pop();
            if(st.empty()) u = i;
            st.push(v[i]), c[v[i]] = 1, p = i;
        }
    }
    if(st.size() != k) fprintf(G, "%d", -1);
    else fprintf(G, "%d", u-p+1);
    return 0;
}