Cod sursa(job #1455664)

Utilizator preda.andreiPreda Andrei preda.andrei Data 28 iunie 2015 19:35:22
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <stdio.h>

using namespace std;

int v[5001];
int el[5001];
int pr[5001];

int main()
{
    FILE *fin=fopen("secv.in", "r");
    FILE *fout=fopen("secv.out", "w");

    int n, x, p, k=0, mi=2000000000, ap=0, g;
    fscanf(fin, "%d", &n);
    v[0]=el[0]=pr[0]=-1;
    for(int i=1; i<=n; i++){
        fscanf(fin, "%d", &v[i]);
        if(v[i]<mi){
            mi=v[i];
            ap=1;
            pr[ap]=i;
        }
        else if(v[i]==mi)
            pr[++ap]=i;

        if(v[i]>el[k])
            el[++k]=v[i];
        else{
            p=1;
            while(el[p]<v[i])
                p++;
            if(el[p]!=v[i]){
                k++;
                for(int j=k; j>p; j--)
                    el[j]=el[j-1];
                el[p]=v[i];
            }
        }
    }
    if(n==0)
        fprintf(fout, "-1");
    else if(k==1)
        fprintf(fout, "1");
    else if(k==n){
        x=1;
        for(int i=1; i<n && x==1; i++)
            if(v[i]>v[i+1])
                x=0;
        if(x==1)
            fprintf(fout, "%d", n);
        else fprintf(fout, "-1");
    }
    else{
        g=0;
        while(ap>0){
            if(n-pr[ap]+1>=k){
                mi=1;
                x=pr[ap];
                while(mi<=k && x<=n){
                    if(v[x]==el[mi]){
                        if(v[x+1]==el[mi]){
                            x=n+1;
                            mi=0;
                        }
                        else mi++;
                    }
                    x++;
                }
                if(mi>k && (g==0 || x-pr[ap]<g))
                    g=x-pr[ap];
            }
            ap--;
        }
        if(g!=0)
            fprintf(fout, "%d", g);
        else fprintf(fout, "-1");
    }
    return 0;
}