题意:






思路:





































#include <cstdio>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n,m,q,u,v,t;
double p;
int a[N];
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
struct que {
    int tag = 0;
    int a[7500005], l, r;
    que(){l = r = 1;}
    bool empty() {return l == r;}
    void push(int x) {a[r] = x - tag;++r;}
    void add() {tag += q;}
    int front() { return a[l] + tag;}
    int pop() {++l; return a[l-1] + tag;}
}q1,q2,q3;
//取出三个队列队头的最大值,并弹出 
int getmx(){
    int mx = -0x3f3f3f3f;
    int flag = 0;
    if(!q1.empty() && mx < q1.front()) {mx = q1.front();flag = 1;}
    if(!q2.empty() && mx < q2.front()) {mx = q2.front();flag = 2;}
    if(!q3.empty() && mx < q3.front()) {mx = q3.front();flag = 3;}
    switch(flag){
        case 1 : q1.pop();break;
        case 2 : q2.pop();break;
        default : q3.pop();
    }
    return mx;
}

void cut(int x) {
    q1.add(),q2.add(),q3.add();
    q2.push(int(p*x));
    q3.push(x - int(p*x));
}
void solve(){
    for(int i = 1;i <= m;i++){
        int x = getmx();
        if(i%t == 0) printf("%d ",x);
        cut(x);
    }
    puts("");
}
int main(){
    n = read(),m = read(),q = read(),u = read(),v = read(),t = read();
    p = u * 1.0 / v;
    for(int i = 1;i <= n;i++) a[i] = read();
    sort(a + 1,a + 1 + n);
    for(int i = n;i >= 1;i--) q1.push(a[i]);
    solve();
    for(int i = 1;i <= n + m;i++){
        int x = getmx();
        if(i%t == 0) printf("%d ",x);
    }    
    return 0;
}