Cod sursa(job #1315836)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 ianuarie 2015 10:11:47
Problema Secv Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#define MAXN 5000
int v[MAXN+1], x[MAXN+1], last[MAXN+1], first[MAXN+1];
inline int tata(int p){
    return p/2;
}
inline int fiust(int p){
    return 2*p;
}
inline int fiudr(int p){
    return 2*p+1;
}
inline void swap(int a, int b){
    int aux=v[a];
    v[a]=v[b];
    v[b]=aux;
}
inline void coborare(int p, int n){
    int f=1, q;
    while((f==1)&&(fiust(p)<=n)){
        q=fiust(p);
        if((fiudr(p)<=n)&&(x[v[q]]<=x[v[fiudr(p)]])){
            q=fiudr(p);
        }
        if(x[v[p]]<=x[v[q]]){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void heapify(int n){
    int i;
    for(i=tata(n); i>0; i--){
        coborare(i, n);
    }
}
inline void heapSort(int n){
    while(n>1){
        swap(1, n);
        n--;
        coborare(1, n);
    }
}
inline int canonizare(int n){
    int k, i;
    k=0;
    i=1;
    while(i<=n){
        k++;
        while((i<n)&&(x[v[i]]==x[v[i+1]])){
            x[v[i]]=k;
            i++;
        }
        x[v[i]]=k;
        i++;
    }
    return k;
}
int main(){
    int n, i, ans, k;
    FILE *fin, *fout;
    fin=fopen("secv.in", "r");
    fout=fopen("secv.out", "w");
    fscanf(fin, "%d", &n);
    for(i=1; i<=n; i++){
        fscanf(fin, "%d", &x[i]);
        v[i]=i;
    }
    heapify(n);
    heapSort(n);
    k=canonizare(n);
    ans=n+1;
    last[0]=1;
    for(i=1; i<=n; i++){
        if(last[x[i]-1]!=0){
            last[x[i]]=i;
            if(x[i]==1){
                first[i]=i;
            }else{
                first[i]=first[last[x[i]-1]];
                if((x[i]==k)&&(ans>i-first[i]+1)){
                    ans=i-first[i]+1;
                }
            }
        }
    }
    if(ans==n+1){
        ans=-1;
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}