1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> using namespace std; const int N=200010; const int INF=1e8; int n,k,x,pos[N],lg[N]; int mx[N][20],mn[N][20]; int ans=1e8;
void init() { memset(mx,-INF,sizeof mx); memset(mn,INF,sizeof mn); lg[1]=0; for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1; for(int i=1;i<=n;i++) mx[i][0]=mn[i][0]=pos[i]; for(int j=1;j<=lg[n];j++){ for(int i=1;i+(1<<j)-1<=n;i++){ mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]); } } }
int mx_query(int l,int r) { int len=lg[r-l+1]; return max(mx[l][len],mx[r-(1<<len)+1][len]); }
int mn_query(int l,int r) { int len=lg[r-l+1]; return min(mn[l][len],mn[r-(1<<len)+1][len]); }
int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++) cin>>x,pos[x]=i; init(); for(int l=1,r=k;r<=n;l++,r=l+k-1){ ans=min(ans,mx_query(l,r)-mn_query(l,r)); } cout<<ans; return 0; }
|