1 #include <cstdio>
2 #include <cmath>
3 using namespace std;
4 int n,ans,a[1000010];
5 int main()
6 {
7 freopen("random.in","r",stdin);
8 freopen("random.out","w",stdout);
9 scanf("%d",&n);
10 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
11 ans=n;
12 for (int i=2;i<ans;i++)
13 for (int j=1;j+i-1<=n;j++)
14 if (ans>abs(a[j]-a[j+i-1])) ans=abs(a[j]-a[j+i-1]);
15 printf("%d",(ans<2?2:ans));
16 return 0;
17 }
1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6 const int inf=2000000000;
7 int n,ans,a[1000010],p[1000010],w[1000010],tot;
8 struct edge { int x,y; }k[1000010];
9 struct node { int l,r,v,size; }tree[10000010];
10 bool cmp(edge x,edge y) { return x.x<y.x; }
11 void insert(int d,int l,int r,int x,int y)
12 {
13 if (l==r)
14 {
15 tree[d].size=tree[d].size+y;
16 if (tree[d].size!=0) tree[d].l=tree[d].r=l; else tree[d].l=tree[d].r=0;
17 if (tree[d].size>2) tree[d].v=0; else tree[d].v=inf;
18 }
19 else
20 {
21 int mid=(l+r)/2;
22 if (x<=mid) insert(d*2,l,mid,x,y); else insert(d*2+1,mid+1,r,x,y);
23 tree[d].v=min(tree[d*2].v,tree[d*2+1].v);
24 if (tree[d*2].r&&tree[d*2+1].l) tree[d].v=min(tree[d].v,p[tree[d*2+1].l]-p[tree[d*2].r]);
25 if (tree[d*2].l) tree[d].l=tree[d*2].l; else tree[d].l=tree[d*2+1].l;
26 if (tree[d*2+1].r) tree[d].r=tree[d*2+1].r; else tree[d].r=tree[d*2].r;
27 }
28 }
29 int main()
30 {
31 freopen("random.in","r",stdin);
32 freopen("random.out","w",stdout);
33 scanf("%d",&n);
34 for (int i=1;i<=n;i++) scanf("%d",&a[i]),k[i].x=a[i],k[i].y=i;
35 sort(k+1,k+n+1,cmp);
36 tot=0;
37 for (int i=1;i<=n;i++) tot+=(k[i].x!=k[i-1].x),w[k[i].y]=tot,p[tot]=k[i].x;
38 for (int i=1;i<=tot*10;i++) tree[i].v=inf;
39 insert(1,1,tot,w[1],1),insert(1,1,tot,w[2],1);
40 ans=inf;
41 int l=1,r=2;
42 while (r<=n)
43 {
44 ans=min(ans,max(tree[1].v,r-l+1));
45 if (l==r-1||tree[1].v>r-l+1)
46 {
47 if (r==n) break;
48 r++;
49 insert(1,1,tot,w[r],1);
50 }
51 else insert(1,1,tot,w[l],-1),l++;
52 }
53 printf("%d",ans);
54 return 0;
55 }