100 #P2111. 二维银行家

二维银行家

Problem Description

kuro 在学习操作系统的时候接触到了著名的银行家算法。 对于一般的情况,可以使用课本上给出的算法进行安全性检查,但她认为这种做法太暴力了!她想知道:在一些特殊情形下,是否存在时间复杂度更优的算法?

具体地,kuro 只关心 资源种类数 (m = 2) 的情形。

形式化的说,现在有 两种不同的资源,你一开始分别拥有 X0,Y0X_0, Y_0 个单位。
共有 nn 个人在等待你提供资源。

对第 ii 个人,有四个参数:

  • NeedXiNeedX_i:他需要的第 1 种资源数量
  • NeedYiNeedY_i:他需要的第 2 种资源数量
  • HasXiHasX_i:如果你满足他的需求,他额外返还的第 1 种资源数量
  • HasYiHasY_i:如果你满足他的需求,他额外返还的第 2 种资源数量

一次“操作”定义如下:

  • 当前你拥有的两种资源为 (X,Y)(X, Y)。
  • 若X≥NeedXi,Y≥NeedYi,X \ge NeedX_i,\quad Y \ge NeedY_i, 则你可以对第 ii 个人进行一次操作:
    • 你先给出 NeedXi,NeedYiNeedX_i, NeedY_i;
    • 随后他返还给你 NeedXi+HasXi,  NeedYi+HasYiNeedX_i + HasX_i,\; NeedY_i + HasY_i。

因此操作结束后,你拥有的资源变为:

(X′,Y′)=(X+HasXi,  Y+HasYi).(X', Y') = (X + HasX_i,\; Y + HasY_i).

你对 每个人最多只能进行一次操作,并且希望最终对 所有 nn 个人都进行一次操作。

你的任务是判断是否存在一种顺序,使得:

  • 在每一步操作时,你拥有的两种资源均保持非负;
  • 最终每个人都恰好被操作一次。

若存在任意一种合法顺序,请输出YES和操作顺序;否则请输出 NO。

Input Format

第一行为三个整数$n,X_0,Y_0(1 \leq n \leq 2*10^5,0 \leq X_0,Y_0 \leq 10^9)$,代表总人数,初始拥有的两种资源数

接下来的nn行,每行包含四个整数$NeedX_i,NeedY_i,HasX_i,HasY_i(0 \leq NeedX_i,NeedY_i,HasX_i,HasY_i \leq 10^9)$,如题目描述中所示

Output Format

如果存在,输出一行"YES",第二行包含nn个整数,代表操作顺序,用空格隔开。

如果有多种方案,你可以输出任意一种。

如果不存在,输出一行"NO"。

Sample

输入

4 3 3
1 2 3 0
3 1 0 4
2 3 2 2
4 4 0 0

输出

YES
1 3 2 4

一种合法执行顺序为(可能不唯一):

  1. 当前 (3,3),执行点 1(需 1,2),更新为 (6,3)
  2. 执行点 3(需 2,3),更新为 (8,5)
  3. 执行点 2(需 3,1),更新为 (8,9)
  4. 执行点 4(需 4,4),更新为 (8,9)

全部点都能执行,故答案为 YES。