P1440

题目

题目描述:

一个含有 nn 项的数列,求出每一项前的 mm 个数到它这个区间内的最小值。若前面的数不足 mm 项则从第 11 个数开始,若前面没有数则输出 00

输入格式:

第一行两个整数,分别表示 nnmm

第二行,nn 个正整数,为所给定的数列 aia_i

输出格式:

nn 行,每行一个整数,第 ii 个数为序列中 aia_i 之前 mm 个数的最小值。

数据范围与说明:

对于 100%100\% 的数据,保证 1mn2×1061\le m\le n\le2\times10^61ai3×1071\le a_i\le3\times10^7

输入输出样例 #1

输入:

1
2
6 2
7 8 1 4 3 2

输出:

1
2
3
4
5
6
0
7
7
1
1
3

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
int q[2000005], a[2000005];
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int front=1,rear=0;
printf("0\n");
for(int i=1;i<=n-1;i++){
while(front<=rear&&q[front]<=i-m){
front++;
}
while(front<=rear&&a[q[rear]]>=a[i]){
rear--;
}
q[++rear]=i;
printf("%d\n",a[q[front]]);
}
}