Cod sursa(job #1847557)

Utilizator AndreosAndrei Otetea Andreos Data 14 ianuarie 2017 18:39:05
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <stack>
#include <algorithm>
using namespace std;
const int NMAX=5000;
struct ELEM
{
	int val,poz;
};
int v[NMAX+5];
ELEM s[NMAX+5];
bool cmp(ELEM a,ELEM b)
{
	if(a.val==b.val)
		return a.poz<b.poz;
	return a.val<b.val;
}
int main()
{
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    int i,n,x;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
    	scanf("%d",v+i);
    	s[i].val=v[i];
    	s[i].poz=i;
    }
    sort(s+1,s+n+1,cmp);
    int t=-1,tpoz=0;
    for(i=1;i<=n;++i)
    {
    	if(t==s[i].val)
    	{
    		v[s[i].poz]=tpoz;
    	}
    	else
		{
			tpoz++;
			t=s[i].val;
			v[s[i].poz]=tpoz;
		}
    }
    int sol=n+1,max=tpoz+1,st,next=0;
    tpoz=1;
    for(i=1;i<=n;++i)
    {
		if(tpoz==2 && v[i]==1 && next==0)
		{
			next=i;
		}
		if(v[i]==tpoz)
		{
			tpoz++;
			if(v[i]==1)
				st=i;
		}
		if(tpoz==max)
		{
			if(sol>i-st+1)
			{
				sol=i-st+1;
			}
			tpoz=2;
			if(next!=0)
			{
				i=next;
				next=0;
			}
		}
    }
    if(sol<=n)
		printf("%d\n",sol);
	else
		printf("-1\n");
    return 0;
}