Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 14533 | Accepted: 4096 | |
Case Time Limit: 5000MS |
Description
Window position | Minimum value | Maximum value |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1100000;
const int inf=(1<<30);
int a[maxn];
struct node
{
int left,right;
int _min,_max;
};
node tree[maxn*3];
int lmin[maxn],lmax[maxn];
void buildtree(int id,int l,int r)
{
tree[id].left=l,tree[id].right=r;
if(tree[id].left==tree[id].right)
{
tree[id]._min=tree[id]._max=a[tree[id].left];
return ;
}
int mid=(tree[id].left+tree[id].right)>>1;
buildtree(2*id,l,mid);
buildtree(2*id+1,mid+1,r);
tree[id]._min=min(tree[2*id]._min,tree[2*id+1]._min);
tree[id]._max=max(tree[2*id]._max,tree[2*id+1]._max);
}
int tmin,tmax;
void query(int id,int l,int r)
{
if(tree[id].left==l&&tree[id].right==r)
{
tmin=min(tmin,tree[id]._min);
tmax=max(tmax,tree[id]._max);
return ;
}
int mid=(tree[id].left+tree[id].right)>>1;
if(r<=mid) query(2*id,l,r);
else if(l>mid) query(2*id+1,l,r);
else
{
query(2*id,l,mid);
query(2*id+1,mid+1,r);
}
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)==2)
{
k--;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
buildtree(1,1,n);
for(int i=1;i+k<=n;i++)
{
tmin=inf;tmax=-inf;
query(1,i,i+k);
lmin[i]=tmin;
lmax[i]=tmax;
}
printf("%d",lmin[1]);for(int i=2;i+k<=n;i++) printf(" %d",lmin[i]);printf("\n");
printf("%d",lmax[1]);for(int i=2;i+k<=n;i++) printf(" %d",lmax[i]);printf("\n");
}
return 0;
}