Cod sursa(job #1226495)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 5 septembrie 2014 18:49:01
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <algorithm>
#define NMax 5005
using namespace std;
ifstream f("secv.in");
ofstream g("secv.out");
int n, v[NMax], i, stack[NMax], p[NMax], st, dr, mij, lmax, ind, k, recons[NMax], j, ok, so[NMax], vc[NMax];
int main()
{
    f>>n;
    for (i=1; i<=n; i++)
        f>>v[i];
    for (i=1; i<=n; i++) {
        st=1;
        dr=lmax;
        while (st<=dr) {
            mij=(st+dr)/2;
            if (stack[mij] < v[i])
                st=mij+1;
            else {
                dr=mij-1;
                ind=mij;
            }
        }
        if (v[i]>stack[lmax]) {
            stack[++lmax]=v[i];
            p[++k]=lmax;
        }
        else {
            stack[ind]=v[i];
            p[++k]=ind;
        }
    }
    ok=1;
    int cop=lmax;
    for (i=n; i>=1; i--) {
        if (p[i]==cop) {
            recons[cop]=v[i];
            if (ok==1) {
                dr=i;
                ok=0;
            }
            st=i;
            cop--;
        }
    }
    for (i=1; i<=n; i++) {
        vc[i]=v[i];
    }
    sort(v+1, v+n+1);
    so[1]=v[1];
    j=1;
    for (i=2; i<=n; i++)
        if (v[i]!=so[j])
            so[++j]=v[i];
    ok=1;
    if (j!=lmax)
        ok=0;
    else
        for (i=1; i<=lmax; i++)
            if (so[i]!=recons[i])
                ok=0;
    while (vc[st+1]==vc[st])
        st++;
    while (vc[dr-1]==vc[dr])
        dr--;
    if (ok==1)
        g<<dr-st+1;
    else
        g<<-1;
    return 0;
}