Cod sursa(job #2780959)

Utilizator AACthAirinei Andrei Cristian AACth Data 8 octombrie 2021 10:26:00
Problema Secv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("secv.in");
ofstream g("secv.out");
#define cin f
#define cout g
//#define int long long
const int Max = 5e3 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
int n;
int a[Max];
void read()
{
	f>>n;
	int i;
	for(i=1;i<=n;i++)
		f>>a[i];
}
int who[Max];
int update(int poz, int val)
{
	who[poz] = max(who[poz],val);
}
void solve()
{	
	std::vector< int > all;
	int i;
	for(i=1;i<=n;i++)
		all.push_back(a[i]);
	sort(all.begin(), all.end());
	all.erase(unique(all.begin(), all.end()),all.end());
	//dp[i] --> maximum starting point
    auto  norma = [&](int x){
    	auto it = lower_bound(all.begin(),all.end(),x);
    	return distance(all.begin(),it) + 1;
    };
    for(i=1;i<=all.size();i++)
    	who[i] = -1;
    int ans = INT_MAX;
    for(i=1;i<=n;i++)
    {
    	int poz = norma(a[i]);
    	if(poz == 1)
    		update(poz,i);
    	else
    	{
    		int prev_best = who[poz - 1];
    		update(poz,prev_best);
    	}
    	if(poz == all.size() and who[all.size()] != -1)
    	{
    		//daca e ultimul vad ce valoare avem aici
    		int this_best = i - who[all.size()] + 1;
    		ans = min(ans,this_best);
    	}
    }
    if(ans != INT_MAX)
    cout<<ans;
    else
    cout<<-1;
}
void restart()
{

}
int32_t main()
{
    nos();

        read();
        solve();
        restart();
    
    return 0;
}