Cod sursa(job #2771478)

Utilizator un_fes_galbendaniel guba un_fes_galben Data 27 august 2021 15:41:20
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <map>
using namespace std;
int v[5005],s[5005],ant[5005],lung[5005];
int inceput[5005];
map<int,int>f;
int main()
{
    ifstream fin("secv.in");
    ofstream fout("secv.out");
    int n,dist=0;
    int st,dr,mij,val,max1=0;
    fin>>n;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        if(f[v[i]]==0){
            dist++;
            f[v[i]]=1;
        }
    }
    for(int i=1;i<=n;i++){
        st=1;dr=max1;val=0;
        while(dr>=st){
            mij=(st+dr)/2;
            if(v[s[mij]]<v[i]){
                val=mij;
                st=mij+1;
            }
            else{
                dr=mij-1;
            }
        }
        lung[i]=val+1;
        s[lung[i]]=i;
        if(lung[i]>max1){
            max1=lung[i];
        }
        if(lung[i]==1){
            ant[i]=-1;
            inceput[i]=i;
        }
        else{
            ant[i]=s[lung[i]-1];
            inceput[i]=inceput[ant[i]];
        }
    }
    int min1=n+1;
    for(int i=n;i>=1;i--){
        if(lung[i]==dist){
            if(i-inceput[i]+1<min1){
                min1=i-inceput[i]+1;
            }
        }
    }
    if(min1==n+1){
        min1=-1;
    }
    fout<<min1<<'\n';
    return 0;
}