Cod sursa(job #1752512)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 4 septembrie 2016 11:38:30
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<algorithm>
#define DIM 5005
using namespace std;
int n, nr, m, i, p, u, mid, sol;
int v[DIM], w[DIM], s[DIM], d[DIM];
ifstream fin("secv.in");
ofstream fout("secv.out");
int main(){
    fin>> n;
    for(i = 1; i <= n; i++){
        fin>> v[i];
        w[i] = v[i];
    }
    sort(w + 1, w + n + 1);
    m = 1;
    for(i = 2; i <= n; i++){
        if(w[m] != w[i]){
            w[++m] = w[i];
        }
    }
    s[1] = v[1];
    d[1] = 1;
    nr = 1;
    sol = n + 1;
    for(i = 2; i <= n; i++){
        if(v[i] > s[nr]){
            nr++;
            s[nr] = v[i];
            d[nr] = d[nr - 1];
            if(nr == m){
                sol = min(sol, i - d[nr] + 1);
            }
        }
        else{
            p = 1;
            u = nr;
            while(p <= u){
                mid = (p + u) / 2;
                if(s[mid] >= v[i]){
                    u = mid - 1;
                }
                else{
                    p = mid + 1;
                }
            }
            s[p] = v[i];
            if(p == 1){
                d[1] = i;
            }
            else{
                d[p] = d[p - 1];
            }
            if(p == m){
                sol = min(sol, i - d[p] + 1);
            }
        }
    }
    if(n == 1){
        fout<<"1\n";
        return 0;
    }
    if(sol == n + 1){
        fout<<"-1\n";
        return 0;
    }
    fout<< sol <<"\n";
    return 0;
}