#include <bits/stdc++.h>
using namespace std;
using ll=long long;  // 别名定义,简化长整型书写,避免溢出
const ll N=1e5+5;    // 定义数组最大容量,适配题目数据范围

// 结构体定义:存储每道题的核心属性
// T:完成该题需要的基础时间;H:该题的难度值
struct q{
    ll T;
    ll H;
};

q Q[N];  // 数组存储所有题目的信息

int main() {
    // 输入加速:关闭同步流+解绑cin与cout,提升大数据量输入效率
    ios::sync_with_stdio(0),cin.tie(0);
    
    // 1. 输入基础参数
    ll n,t;         // n:题目总数;t:两人拥有的总时间
    cin>>n>>t;
    ll a,b;         // a:clccle的难度阈值;b:rqy的难度阈值
    cin>>a>>b;
    
    // 2. 输入每道题的基础耗时(T)
    for(ll i=1;i<=n;i++){
        cin>>Q[i].T;
    }
    // 3. 输入每道题的难度值(H)
    for(ll i=1;i<=n;i++){
        cin>>Q[i].H;
    }

    // ===================== 算法核心1:计算clccle能完成的题目数 =====================
    // 算法思想:clccle只做难度低于a的题,且按题目顺序依次尝试,时间不足则跳过
    ll t1=t;        // 复制总时间,避免修改原始t值
    ll cnt1=0;      // 统计clccle完成的题目数量
    for(ll i=1;i<=n;i++){
        // 步骤1:跳过难度≥a的题目(clccle不做难题)
        if(Q[i].H>=a){
            continue;
        }
        // 步骤2:剩余时间不足以完成当前简单题,跳过
        if(Q[i].T>t1){
            continue;
        }
        // 步骤3:时间足够,完成该题:扣除耗时+计数+1
        t1-=Q[i].T;
        cnt1++;
    }

    // ===================== 算法核心2:计算rqy能完成的题目数 =====================
    // 算法思想:rqy做难度≥b的题需要2倍时间,难度<b的题正常时间;按顺序尝试,时间不足则跳过
    ll t2=t;        // 重新复制总时间,用于rqy的计算
    ll cnt2=0;      // 统计rqy完成的题目数量
    for(ll i=1;i<=n;i++){
        // 分支1:当前题是难题(≥b)且2倍时间超过剩余时间 → 跳过
        if(Q[i].H>=b&&Q[i].T*2>t2){
            continue;
        }
        // 分支2:当前题是难题(≥b)且2倍时间足够 → 完成该题
        else if(Q[i].H>=b&&Q[i].T*2<=t2){
            t2-=Q[i].T*2;  // 扣除2倍基础时间
            cnt2++;        // 计数+1
            continue;
        }
        // 分支3:当前题是简单题(<b)但正常时间超过剩余时间 → 跳过
        else if(Q[i].H<b&&Q[i].T>t2){
            continue;
        }
        // 分支4:当前题是简单题(<b)且正常时间足够 → 完成该题
        else{
            t2-=Q[i].T;   // 扣除基础时间
            cnt2++;       // 计数+1
            continue;
        }
    }

    // 4. 输出结果:依次输出clccle和rqy完成的题目数量
    cout<<cnt1<<" "<<cnt2;
    return 0;
}

题目简单,但是雄狮般的语言描述