Cod sursa(job #3345635)

Utilizator CheeseEaterHackRoman Alex CheeseEaterHack Data 10 martie 2026 15:40:01
Problema Secv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("secv.in");
ofstream fout("secv.out");
#define INF INT_MAX
int n;
struct vp
{
    long long val; int poz, nr;
}v[5001];
int dp[5001][5001];
bool cmp(vp a, vp b)
{
    return a.val<b.val;
}
bool cmp1(vp a, vp b)
{
    return a.poz<b.poz;
}
vector<int> gr[5001];

int main()
{
    fin>>n;
    for (int i=1; i<=n; i++)
    {
        fin>>v[i].val;
        v[i].poz=i;
    }
    sort(v+1, v+n+1, cmp);
    int cnt=0;
    v[0].val=-1;
    for (int i=1; i<=n; i++)
    {
        if (v[i].val!=v[i-1].val)
        {
            cnt++;
        }
        v[i].nr=cnt;
    }
    sort(v+1, v+n+1, cmp1);
    for (int i=1; i<=n; i++)
    {
        gr[v[i].nr].push_back(i);
    }
    for (int i=cnt; i>=1; i--)
    {
        int pt=0;
        for (int j=0; j<gr[i].size(); j++)
        {
            if (i==cnt)
            {
                dp[i][j]=gr[i][j];
            }
            else
            {
                while (pt<gr[i+1].size() and gr[i][j]>gr[i+1][pt])
                {
                    pt++;
                }
                if (pt>=gr[i+1].size())
                {
                    dp[i][j]=INF;
                }
                else
                {
                    dp[i][j]=dp[i+1][pt];
                }
            }
        }
    }
    int lungmin=INF;
    for (int j=0; j<gr[1].size(); j++)
    {
        lungmin=min(lungmin, dp[1][j]-gr[1][j]+1);
    }
    if (lungmin==INF)
    {
        fout<<-1; return 0;
    }
    fout<<lungmin;

    return 0;
}