Graze
题号:NC200044
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

Vanis: "我,Vanis,有一个梦想,就是成为STG之星 (STG star)."
Qiy: "......"

于是Vanis和Qiy要做一款STG (Shooter Game) 游戏,但是他们太菜了,于是想请你帮忙实现其中的一个小功能。

首先,这个游戏属于平面竖版卷轴射击游戏,为了方便表述,定义如下名词:
坐标系:规定以向右方向为x坐标轴正方向,以向上方向为y轴正方向,所有游戏对象都处于这个二维笛卡尔坐标系中。
坐标(简称“”):指二元有序组,用来唯一标识坐标系中每个点的位置。
自机:玩家操控的角色,使用这个角色可以发射子弹射击敌机,相应地如果被敌机的子弹击中就会被击破。
自机中心:用来为自机定位的一个点,由一个坐标表示。
敌机:由电脑控制的角色,会发射子弹攻击自机。
子弹:能够对自机造成伤害的游戏对象。按照攻击类型分类,主要分为自机狙、随机弹、固定弹三种。按照形状分类,这里只考虑两种:点弹和方形弹两种。
一般自机判定区:此处指一个在自机图像上的不可见矩形,用来判定自机是否被击中。自机中心一定在判定区内部,自机判定区可以由w和h两个参数以及自机中心唯一确定,对于点,如果其满足,则称点在此判定区内部。
退化自机判定区:当一般自机判定区的w和h两个参数只有其中之一为0时,自机判定区退化成一条线段,此时该图形的点集是由其线段上所有点构成的(包括线段端点);当一般自机判定区的w和h两个参数都等于0的时候,自机判定区退化成了一个点,且这个点恰好是自机中心,该图形的点集只包括这一个点。将这样的判定区称呼为退化自机判定区。
子弹碰撞箱(简称“碰撞箱”):此处指在子弹上用来判定是否击中自机的不可见图形(在这道题中不考虑敌机)。
点弹:此处指碰撞箱为一个点的子弹,其由一个坐标确定,该图形的点集只包括这一个点。
一般方形弹:此处指碰撞箱为一个矩形的子弹,由两个坐标确定,前者表示矩形的左下角坐标,后者表示矩形的右上角坐标。
退化方形弹:相对于一般方形弹而言,如果左下角与右上角的x轴坐标或y轴坐标二者之一相等,则矩形退化成一条线段,该图形的点集包括这条线段上的所有点(包括线段端点);如果左下角坐标与右上角坐标完全一致,其形状退化成了一个点,该图形的点集只有这一个点。此类方形弹称作退化方形弹。
矩形对象:指游戏系统中,以矩形进行运算的对象,此处包括:一般自机判定区和一般方形弹。
内部:此概念仅针对游戏中的矩形对象。指矩形内侧封闭区域的所有点以及其轮廓线上的所有点构成的集合。
相交:两个图形的点集的交集如果不为空,即至少有一个点同时属于这两个图形的点集,则认为两图形相交。
完全一致:如果两个坐标满足,则称这两个坐标(或这两个点)完全一致。

判断子弹是否命中自机,只需要判断子弹碰撞箱是否与自机判定区产生相交即可。

具体些则是:

一般自机判定区子弹命中判定规则如下:
1. 对于点弹而言,如果点弹的碰撞箱与自机判定区的内部相交,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果其碰撞箱与自机判定区相交,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其退化成一条线段时,如果构成碰撞箱的这一条线段与自机判定区内部相交,则判定为命中,反之判定为未命中;当其退化成一个点时,如果其碰撞箱的这个点在自机判定区内部这一点集中,则判定为命中,反之判定为未命中。

退化自机判定区子弹命中规则如下,如果退化自机判定区为一条线段:
1. 对于点弹而言,如果点弹在自机判定区的点集中,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果自机判定区与碰撞箱内部相交,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其退化成一条线段,如果自机判定区与这条线段相交,则判定为命中,反之判定为未命中;当其退化成一个点,如果构成碰撞箱的点在自机判定区的点集中,则判定为命中,反之判定为未命中。

如果退化自机判定区是一个点:
1. 对于点弹而言,如果点弹坐标与自机中心坐标完全一致,则判定为命中,反之判定为未命中。
2. 对于一般方形弹而言,如果构成自机判定区的点在碰撞箱的点集中,则判定为命中,反之判定为未命中。
3. 对于退化方形弹而言,当其碰撞箱退化成一条线段时,如果构成自机判定区的点在碰撞箱的点集中,则判定为命中,反之判定为未命中;当其碰撞箱退化成一个点,如果其坐标与自机中心坐标完全一致,则判定为命中,反之判定为未命中。

你的程序需要处理三种操作:
1. 将自机中心移动到某个点,输入格式为“1 x y”(不包括双引号)。
2. 判断当前在位置处的点弹(指碰撞箱)此时是否命中自机,输入格式为“2 x y”(不包括双引号)。
3. 判断当前左下角在位置处,右上角坐标在位置处的方形弹(指碰撞箱)此时是否命中自机,输入格式为“3 x1 y1 x2 y2”(不包括双引号)。

对于操作2和3,你的程序需要输出1表示自机被命中,输出0表示未被命中。
对于操作1,你的程序需要输出2表示自机发生移动(自机中心改变),输出3表示自机未发生移动(自机中心没有改变)。

图一给出了部分几种命中情形,图二给出了部分几种未命中情形。(注:颜色仅为了方便区分两个区域)
图一:

图二:

输入描述:

第一行包含四个整数,相邻整数之间使用一个空格符分隔,分别表示自机最初所在的x坐标、y坐标,以及自机判定区的两个参数w和h。
第二行包含一个整数q,表示操作次数。
从第三行开始,每行首先输入一个整数op,表示操作类型(如题目描述),如果op取值为1或2,则在这一行会继续依次输入两个整数x和y,含义如题目描述中所示,相邻整数使用一个空格符分隔。如果op取值为3,则在这一行会继续依次输入四个整数,含义如题目描述中所示,相邻整数使用一个空格符分隔。

数据规范:
* 保证都是整数。
* .
* .
* .
* .

输出描述:

输出包含一行,由若干个0或1或2或3组成的长度为q的字符串。
示例1

输入

复制
100 100 1 2
8
1 100 100
1 101 101
1 100 100
2 101 102
2 103 104
3 101 102 103 104
3 101 100 103 104
3 102 101 103 104

输出

复制
32210110

备注:

数据量较大,请采用较为快速的输入输出方式。