/*
感觉noip不会靠这些东西..但是碰见了不看看就觉得很别扭,本来想大体知道就行了,背个板,然后 我一下午+一晚上就没干别的QAQ
先说说线段树吧 处理二维问题的有两种方法 树套树和四叉树
后者好理解常数小但是不资次打标记(反正我不会~~~)
后者XXXX常熟大但是资次打标记(我也不会~~~)
只看看前面那个 树套树嘛 就是在一维的基础上 每个节点都连出一棵树来
空间复杂度n*n 因为他不支持打标记 所以不能区间改 区间查
只能区间改 单点查 或者单点改 区间查
再啦啦树状数组 同样的 必须扯着一个单点
区间改的时候 可以向上或者向下更新 查询的时候正好反着
基础的东西就这么多了 也没准备学的很详细
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
poj 2155
第一个二维线段树的题
树套树写法 不支持打标记
(四叉树支持 然而并不会QAQ)
所以这个区间修改就和之前的不大一样
准确的说这导致只能单点查询
查单点的时候 把路径上的遇到的标记累加
因为没有下传 所以都加起来
还有就是 Query的时候 不是找到x这一行在进入第二层线段树
而是每个第一层的区间(前提是包含x)都进入第二层y区间找
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
#define lc k*2
#define rc k*2+1
#define mid (l+r)/2
using namespace std;
int T,n,m,x1,x2,y1,y2,num;
bool s[maxn*4][maxn*4];
char c[5];
void Changey(int kx,int k,int l,int r,int x,int y){
if(x<=l&&y>=r){
s[kx][k]=!s[kx][k];
return;
}
if(l==r)return;
if(x<=mid)Changey(kx,lc,l,mid,x,y);
if(y>mid)Changey(kx,rc,mid+1,r,x,y);
}
void Changex(int k,int l,int r,int x,int y){
if(x<=l&&y>=r){
Changey(k,1,1,n,y1,y2);
return;
}
if(l==r)return;
if(x<=mid)Changex(lc,l,mid,x,y);
if(y>mid)Changex(rc,mid+1,r,x,y);
}
void Queryy(int kx,int k,int l,int r,int x){
num+=s[kx][k];
if(l==r)return;
if(x<=mid)return Queryy(kx,lc,l,mid,x);
else return Queryy(kx,rc,mid+1,r,x);
}
void Queryx(int k,int l,int r,int x){
Queryy(k,1,1,n,y1);
if(l==r)return;
if(x<=mid)return Queryx(lc,l,mid,x);
else return Queryx(rc,mid+1,r,x);
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n*4;i++)
for(int j=1;j<=n*4;j++)
s[i][j]=0;
while(m--){
scanf("%s",c);
if(c[0]=='C'){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Changex(1,1,n,x1,x2);
}
else {
num=0;
scanf("%d%d",&x1,&y1);
Queryx(1,1,n,x1);
printf("%d\n",num&1);
}
}
printf("\n");
}
return 0;
}
/*
之前树状数组的了解不全面啊
一直以为只能单点修改区间查询
今天又学到了区间修改单点查询
二维的也是一样
改的时候用矩形右下角代表整个矩形改没改过
然后把多改的改回来
单点查询的时候向下询问 累加
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
int T,n,m,x1,x2,y1,y2;
int s[maxn][maxn];
char c[5];
int low(int x){
return x&(-x);
}
void Insert(int x,int y){
for(int i=x;i>0;i-=low(i))
for(int j=y;j>0;j-=low(j))
s[i][j]++;
}
int Query(int x,int y){
int ret=0;
for(int i=x;i<=n+2;i+=low(i))
for(int j=y;j<=n+2;j+=low(j))
ret+=s[i][j];
return ret;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n+2;i++)
for(int j=1;j<=n+2;j++)
s[i][j]=0;
while(m--){
scanf("%s",c);
if(c[0]=='C'){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1+=2;x2+=2;y1+=2;y2+=2;
Insert(x2,y2);Insert(x1-1,y1-1);
Insert(x2,y1-1);Insert(x1-1,y2);
}
else {
scanf("%d%d",&x1,&y1);
x1+=2;y1+=2;
int num=Query(x1,y1);
printf("%d\n",num&1);
}
}
printf("\n");
}
return 0;
}
/*hud1823*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1001
#define lc k*2
#define rc k*2+1
#define mid (l+r)/2
using namespace std;
int n=1000,m,x1,y1,x2,y2;
short int mx[maxn*3][maxn*4],z;
char c[5];
void Insert_y(int kx,int k,int l,int r){
mx[kx][k]=max(mx[kx][k],z);
if(l==r)return;
if(y1<=mid)Insert_y(kx,lc,l,mid);
else Insert_y(kx,rc,mid+1,r);
mx[kx][k]=max(mx[kx][lc],mx[kx][rc]);
}
void Insert_x(int k,int l,int r){
Insert_y(k,1,0,n);
if(l==r)return;
if(x1<=mid)Insert_x(lc,l,mid);
else Insert_x(rc,mid+1,r);
}
int Query_y(int kx,int k,int l,int r){
if(y1<=l&&y2>=r)return mx[kx][k];
if(y2<=mid)return Query_y(kx,lc,l,mid);
else if(y1>mid)return Query_y(kx,rc,mid+1,r);
else return max(Query_y(kx,lc,l,mid),Query_y(kx,rc,mid+1,r));
}
int Query_x(int k,int l,int r){
if(x1<=l&&x2>=r)return Query_y(k,1,0,n);
if(x2<=mid)return Query_x(lc,l,mid);
else if(x1>mid)return Query_x(rc,mid+1,r);
else return max(Query_x(lc,l,mid),Query_x(rc,mid+1,r));
}
int main()
{
while(1){
scanf("%d",&m);
if(m==0)break;
memset(mx,-1,sizeof(mx));
float xi,yi,h1,h2;
int h;
while(m--){
scanf("%s",c);
if(c[0]=='I'){
scanf("%d%f%f",&h,&xi,&yi);
x1=h;y1=int(xi*10);z=int(yi*10);
Insert_x(1,0,n);
}
else {
scanf("%f%f%f%f",&h1,&h2,&xi,&yi);
x1=int(h1+0.9);x2=int(h2+0.9);
y1=int(xi*10);y2=int(yi*10);
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
int ans=Query_x(1,0,n);
if(ans==-1)printf("-1\n");
else printf("%.1f\n",ans/10.0);
}
}
}
return 0;
}