Pagini recente » Cod sursa (job #3331) | Cod sursa (job #1689503) | Cod sursa (job #2533869) | Cod sursa (job #2967059) | Cod sursa (job #1315841)
#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;
}