Cod sursa(job #1847565)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 14 ianuarie 2017 18:52:46
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int NMAX = 5000;
int v[NMAX + 5] , t[NMAX + 5] , p[NMAX + 5] , f[NMAX + 5];
typedef pair<int,int> ii;
deque <ii> q;
int main()
{
    freopen("secv.in" , "r" , stdin);
    freopen("secv.out" , "w" , stdout);
    int n , i , cnt , st , dr , med , k , lmin , q , w;
    scanf("%d" , &n);
    for(i = 1 ; i <= n ; i ++)
        scanf("%d" , &v[i]) , t[i] = v[i];
    sort(t + 1 , t + n + 1);
    cnt = 0;
    v[n + 1] = 2000000001;
    for(i = 1 ; i <= n ; i ++)
        if(t[i] != t[i + 1])
            p[++ cnt] = t[i];
    for(i = 1 ; i <= n ; i ++)
    {
        st = 1;
        dr = cnt;
        while(st <= dr)
        {
            med = (st + dr) / 2;
            if(p[med] == v[i])
            {
                v[i] = med;
                break;
            }
            else if(p[med] < v[i])
                st = med + 1;
            else
                dr = med - 1;
        }
    }
    k = cnt;
    cnt = 0;
    f[0] = 1;
    lmin = n + 1;
    for(st = dr = 1 ; dr <= n ; dr ++)
    {
        if(f[v[dr]] == 0 && f[v[dr] - 1] == 1)
            cnt ++ , f[v[dr]] ++;
        else if(f[v[dr] - 1] == 1)
            f[v[dr]] ++;
        if(cnt == k)
            while(st <= dr && cnt == k)
            {
                f[v[st]] --;
                if(f[v[st]] == 0)
                {
                    cnt --;
                    for(i = v[st] + 1 ; i <= k ; i ++)
                        f[i] = 0;
                }
                st ++;
                if(dr - st + 1 < lmin)
                    lmin = dr - st + 1 , q = st , w = dr;
            }
    }
    printf("%d\n" , lmin);
    return 0;
}