Cod sursa(job #2703289)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 7 februarie 2021 22:51:35
Problema Secv Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("secv.in");
ofstream fout ("secv.out");

int v[5001], o[5001], w[5001], poz[5001], ind[5001], ant[5001];

int main()
{
    int n, i, j, k=0, ct=0, p, u, mij, rez;
    fin>>n;
    for(i=1; i<=n; i++){
        fin>>v[i];
        o[i] = v[i];
    }
    sort(o+1, o+n+1);

    for(i=1; i<=n; i++){
        if(o[i] != o[i - 1]){
            k++;
            w[k] = o[i];
        }
    }

    /*for(i=1; i<=k; i++){
        cout<<w[i]<<' ';
    }cout<<"\n";

    for(i=1; i<=n; i++){
        cout<<v[i]<<' ';
    }cout<<"\n";*/

    ct=0;
    for(i=1; i<=n; i++){

        if(v[i] == w[ct + 1]){
            //cout<<"AICI\n";
            ct++;
            poz[i] = ct;
            ind[ct] = i;
            ant[i] = ind[ct - 1];
        }
        else if(v[i] > w[ct + 1]){
            poz[i] = -1; //nu am ce face cu el
        }
        else{
            p=1;
            u=ct;
            while(p <= u){
                mij = (p + u) / 2;
                if(w[mij] < v[i]){
                    p = mij + 1;
                }
                else {
                    u = mij - 1;
                }
            }

            poz[i] = p;
            ant[i] = ind[p - 1];
            ind[p] = i;
        }

        //cout<<"i= "<<i<<"\npoz["<<i<<"]= "<<poz[i]<<"\nct= "<<ct<<"\n\n";
    }

    rez = 5002;
    for(i=1; i<=n; i++){
        if(poz[i] == k){
            j=i;
            //cout<<"j= "<<j<<"\n";
            while( poz[j] > 1){
                j = ant[j];
                //cout<<"j= "<<j<<"\n";
            }

            rez = min(rez, i - j + 1);
        }
    }

    fout<<rez;
}