bzoj#P2758. [SCOI2012]Blinker的噩梦

[SCOI2012]Blinker的噩梦

题目描述

一天 Blinker 醒来,发现自己成为了一个二维世界的点,而且被标记上了一个奇怪的值。

这个世界是由 nn 个边界互不相交(且不相切)的图形组成,这里图形仅包括圆和凸多边形,每个图形还有一个权值。

每次 Blinker 走进或走出某个图形时(相切时经过不算),BlinkerBlinker 的标记值就会被异或上那个值。

现在,我们记录了 Blinker 在这个世界的 mm 天的信息。

每天可能发生两种事情,一种是某个图形的权值更改为某个值;另一种是 Blinker 从某个点走到另一个点。

我们假设 Blinker 首次出发前的标记值为0,我们希望知道他每次到达目的地后的标记值。

输入格式

输入的第一行包含 n,mn,m,分别表示这个世界的图形数和记录的天数。
接下来有 nn 行,每行表示一个图形。
如果一行以字符 C 开头,表示这个图形是一个圆,后面紧跟着三个实数 x,y,rx, y, r 和一个整数 vv ,分别表示圆心的 xx 坐标,yy 坐标和圆的半径以及该图形对应的值。
如果一行以字符 P 开头,表示这个图形是凸多边形,后面紧跟着 一个整数 LL,表示凸多边形的点数,然后后面有LL 对实数 x0,y0,x1,y1x_0,y_0,x_1,y_1,表示 LL 个点的坐标;这一行最后一个数是一个整数 vv,表示这个 图形对应的值,保证凸多边形上的点按照顺时针给出。
接下来有 mm 行,每行表示一天的记录信息。
如果一行以字符 Q 开头,表示这一天 BlinkerBlinker 出行了,接下来有 x0,y0,x1,y1x_0,y_0,x_1,y_1 四个实数, 分别表示出发点的坐标和目的地的坐标。
如果一行以字符 C 开头,表示这一天某个图形的值改变了,接下来有两个 iivv ,表示 输入中第 ii 个出现的图形的值变成 vv

输出格式

对于 BlinkerBlinker 的每个出行输出他到达目的地后的标记值,很显然这个值与 BlinkerBlinker 的路径无关。

2 4 
C 0 0 2 1 
P 4 -1 -1 -1 1 1 1 1 -1 2 
Q -2 -2 2 2 
Q -1.5 0 0.0 0.0 
C 1 1005 
Q -1.5 0 0.0 0.0 
0
2
0

提示

样例的世界形如上图:

第一天 Blinker 的初始标记值为00,可能从 AA 沿直线走到 BB,或者他绕过圆走到 BB,他的标记值最终都保持不变为00(假如沿直线从 AA 走到 BB,共穿过 44 次边界,Blinker 的标记值变化过程为 1,3,1,01,3,1,0)。

第二天 Blinker 的初始标记值为 00,他通过某种不经过图形边界的方法到达了 CC 点(即 blink,瞬间移动或闪烁),然后从 CC 沿某种路径走到 DD,这时他的标记值变为 22

第三天圆的权值变为 10051005

第四天 Blinker 的初始标记值为 22,他再次回到 CC,并再次从 CC 走到 DD,这时他的标记值又变回 00

数据规模与约定

对于 30%30\% 的数据,保证:1m10.01\leq m\leq 10.0 ,凸多边形的点数加上圆的个数小于等于 10310^3
剩余数据中,保证:

  • 存在一组无图形值变动的数据;
  • 存在一组无凸多边形的数据;

对于 100%100\% 的数据,保证:1n,m1051\leq n,m\leq 10^5,单个凸多边形的点数小于等于 3434
图形互不相交,且 Blinker 的出发点和目的地不在图形的边界。