Cod sursa(job #1334978)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 4 februarie 2015 20:33:13
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIM 5005
using namespace std;

ifstream fin ("secv.in" );
ofstream fout("secv.out");

int n, m, i, j, nr, a, b, mid;
int v[DIM], w[DIM], t[DIM];
int maxim, minim;

void Read(){
    fin >> n;
    for(i = 1; i <= n; i ++)
        fin >> v[i];
    return;
}

void Rebuild(){
    minim = DIM; maxim = -DIM;
    for(i = 1; i <= n; i ++)
        w[i] = v[i];
    sort(w + 1, w + n + 1);
    w[0] = -1;
    for(i = 1; i <= n; i ++){
        if(w[i] == w[i-1])
            t[i] = nr;
        else
            t[i] = ++nr;
    }
    for(i = 1; i <= n; i ++){
        a = 1; b = n;
        while(a <= b){
            mid = (a+b)/2;
            if(w[mid] == v[i])
                break;
            if(w[mid] < v[i])
                a = mid + 1;
            else
                b = mid - 1;
        }
        v[i] = t[mid];
    }
    for(i = 1; i <= n; i ++)
        if(v[i] > maxim)
            maxim = v[i];
    memset(w, 0, sizeof(w));
    memset(t, 0, sizeof(t));
    return;
}

void Code(){
    for(i = 1; i <= n; i ++){
        if(v[i] == 1)
            w[1] = i;
        else
            if(w[v[i]-1] != 0)
                w[v[i]] = w[v[i]-1];
        if(v[i] == maxim)
            if(i - w[v[i]] + 1 < minim)
                minim = i - w[v[i]] + 1;
    }
    if(minim == -DIM)
        fout << -1;
    else
        fout << minim;
    return;
}

int main(){
    Read();
    Rebuild();
    Code();
    return 0;
}