描述


强大的冰魔法师zz一路过关闯将,终于独自一人杀到了神龙面前。神龙的血量值为HP,正常状态下每秒进行一次攻击,伤害值为DAMAGE。zz精通n种瞬发冰控魔法(在同一秒内,zz发动的冰魔法要比神龙的攻击快上一点),第i(1<=i<=n)种魔法伤害值为damage[i],并使神龙进入冰冻状态(神龙在冰冻状态下不会进行攻击,且如果神龙在冰冻状态下再次受到冰魔法的攻击,则冰冻时间累加),维持freeze[i]秒,使用完后有cd[i]秒的时间不得使用任何魔法。当zz与神龙有一方的血量值小于等于0时,即判定那一方死亡。zz想杀神龙,但是又怕死,所以请你帮他判断一下以他现有的血量hp和他的技能,能否强杀神龙。

输入

第一行输入整数T代表T组数据,T<=30 
输入数据的第一行为2个整数HP(0< HP<10^8) DAMAGE (0< DAMAGE<10^8) 分别代表神龙的血量值和神龙每次的攻击值。 
第二行也是2个整数hp(0< hp<10^8),n(1<=n<=1000000) 分别代表zz的血量以及zz会的魔法种类数。 
第三行到n+2行每行均为3个整数damage[i] (0<=damage<=100),freeze[i] (0<=freeze[i]<=100),cd[i] (1<=cd[i]<=100),(1<=i<=n)分别代表第i种魔法的伤害值,冰控时间,冷却时间。

输出

输出只有一行YES或NO,分别代表能杀死神龙和不能杀死神龙。

样例输入


20 4 
10 2 
3 1 2 
5 0 1 
20 3 
10 2 
3 1 2 
5 0 1

样例输出

NO 
YES

c++

#include <cstdio>
#include <iostream>
#define inf (0x3f3f3f3f)
using namespace std;
const int maxn = 1000000 + 20;
int att[maxn];
int fre[maxn];
int wait[maxn];
void work() {
    int HP, hurt;
    int MYHP, m;
    scanf("%d%d%d%d", &HP, &hurt, &MYHP, &m);
    int mx = -inf;
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &att[i], &fre[i], &wait[i]);
        mx = max(mx, att[i]);      //最大攻击力
    }
    int need = MYHP / hurt + ((MYHP % hurt) > 0);
    for (int i = 1; i <= m; ++i) {
        int dis = wait[i] - fre[i];
        if (dis == 0 && att[i] == 0) continue;
        if (dis == 0 && att[i] != 0) {     //冷却时间等于冰冻时间且攻击力不为0
            printf("YES\n");
            return;
        }
        if (dis < 0 && mx != 0) {     //冷却时间小于冰冻时间且最大攻击力不为0
            printf("YES\n");
            return;
        }
        if (dis < 0 && mx == 0) {
            continue;
        }
        int how = need / dis + ((need % dis) > 0);    //how为冰法能攻击次数
        int cut = (how - 1) * att[i] + mx;     //cut为冰法以本魔法为攻击的最大攻击力
        if (cut >= HP) {
            printf("YES\n");
            return;
        }
    }
    printf("NO\n");
    return;
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) work();
    return 0;
}