Cod sursa(job #1998838)

Utilizator victoreVictor Popa victore Data 9 iulie 2017 12:52:47
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;

//ok nlogn gata
const int nmax=5005;
map<int,int> m;
int maxval,maxstart,poz,val,startum;

struct al
{
    int x,start;
}d[nmax],arb[4*nmax+5];

struct humus
{
    int x,i;
}v[nmax];

inline void update(int node,int st,int dr)
{
    if(st==dr)
    {
        arb[node].x=val;
        arb[node].start=startum;
        return;
    }
    int med=((dr-st)>>1) + st;
    if(med<poz)
        update(node<<1|1,med+1,dr);
    else
        update(node<<1,st,med);
    if(arb[node<<1].x>arb[node<<1|1].x || (arb[node<<1].x==arb[node<<1|1].x && arb[node<<1].start > arb[node<<1|1].start))
        arb[node]=arb[node<<1];
    else
        arb[node]=arb[node<<1|1];
}

inline void query(int node,int st,int dr)
{
    if(1<=st&&dr<=poz)
    {
        if(maxval<arb[node].x)
        {
            maxval=arb[node].x;
            maxstart=arb[node].start;
        }
        else if(maxval==arb[node].x&&maxstart<arb[node].start)
            maxstart=arb[node].start;
        return;
    }
    int med=((dr-st)>>1) + st;
    if(st<=poz)
        query(node<<1,st,med);
    if(med<poz)
        query(node<<1|1,med+1,dr);
}

inline bool cmp(humus a,humus b)
{
    if(a.x==b.x)
        return a.i>b.i;
    return a.x<b.x;
}
int main()
{
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    int n,i,j,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&v[i].x),v[i].i=i;
        if(m.find(v[i].x)==m.end())
            m[v[i].x]=++cnt;
    }
    sort(v+1,v+n+1,cmp);
    for(i=1;i<=n;++i)
    {
        poz=v[i].i;
        maxval=0;
        maxstart=i;
        query(1,1,n);
        val=d[v[i].i].x=maxval+1;
        startum=d[v[i].i].start=maxstart;
        update(1,1,n);
    }
    int lngmin=5005;
    for(i=1;i<=n;++i)
    {
        if(d[i].x==cnt&&i-d[i].start+1<lngmin)
            lngmin=i-d[i].start+1;
    }
    if(lngmin==5005)
        printf("-1");
    else
        printf("%d",lngmin);
}