裸裸的二维线段树,二维线段树的入门题,写的树套树,以前觉得很难,现在发现不是那么难了。。。
强转注意精度问题,程序最后有组数据,应该输出-1。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
const int MAXN=1010;
struct Sub_Tree
{
int l,r;
int val;
int mid()
{
return (l+r)>>1;
}
};
struct Tree
{
int l,r;
int mid()
{
return (l+r)>>1;
}
Sub_Tree subtree[MAXN<<2];
}tree[410];
void pushup(int k,int fa)
{
tree[fa].subtree[k].val=max(tree[fa].subtree[ls].val,tree[fa].subtree[rs].val);
//printf("val: ls=%d rs=%d k=%d\n",tree[fa].subtree[ls].val,tree[fa].subtree[rs].val,tree[fa].subtree[k].val);
//printf("l-r: ls=%d rs=%d k=%d\n",tree[fa].subtree[ls].l,tree[fa].subtree[rs].l,tree[fa].subtree[k].l);
}
void build_sub(int l,int r,int k,int fa)
{
tree[fa].subtree[k].l=l;
tree[fa].subtree[k].r=r;
tree[fa].subtree[k].val=-1;
if(l==r)
return;
int mid=tree[fa].subtree[k].mid();
build_sub(l,mid,ls,fa);
build_sub(mid+1,r,rs,fa);
pushup(k,fa);
}
void build(int l,int r,int k)
{
tree[k].l=l;
tree[k].r=r;
build_sub(0,1000,1,k);
if(l==r)
return;
int mid=tree[k].mid();
build(l,mid,ls);
build(mid+1,r,rs);
}
void update_sub(int pos,int val,int k,int fa)
{
if(tree[fa].subtree[k].l==tree[fa].subtree[k].r)
{
tree[fa].subtree[k].val=max(tree[fa].subtree[k].val,val);
//printf("update: l=%d r=%d val=%d\n",tree[fa].subtree[k].l,tree[fa].subtree[k].r,tree[fa].subtree[k].val);
return;
}
int mid=tree[fa].subtree[k].mid();
if(pos<=mid)
update_sub(pos,val,ls,fa);
else
update_sub(pos,val,rs,fa);
pushup(k,fa);
}
void update(int pos1,int pos2,int val,int k)
{
update_sub(pos2,val,1,k);
if(tree[k].l==tree[k].r)
{
return;
}
int mid=tree[k].mid();
if(pos1<=mid)
update(pos1,pos2,val,ls);
else
update(pos1,pos2,val,rs);
}
int query_sub(int l,int r,int k,int fa)
{
if(tree[fa].subtree[k].l>=l&&tree[fa].subtree[k].r<=r)
{
//printf("sl=%d sr=%d val=%d\n",tree[fa].subtree[k].l,tree[fa].subtree[k].r,tree[fa].subtree[k].val);
return tree[fa].subtree[k].val;
}
int mid=tree[fa].subtree[k].mid();
if(r<=mid)
{
return query_sub(l,r,ls,fa);
}
else if(l>mid)
{
return query_sub(l,r,rs,fa);
}
else
{
int t1=query_sub(l,mid,ls,fa);
int t2=query_sub(mid+1,r,rs,fa);
return max(t1,t2);
}
}
int query(int l,int r,int sl,int sr,int k)
{
if(tree[k].l>=l&&tree[k].r<=r)
{
//printf("l=%d r=%d\n",tree[k].l,tree[k].r);
//printf("sl=%d sr=%d\n",sl,sr);
return query_sub(sl,sr,1,k);
}
int mid=tree[k].mid();
if(r<=mid)
return query(l,r,sl,sr,ls);
else if(l>mid)
return query(l,r,sl,sr,rs);
else
{
int t1=query(l,mid,sl,sr,ls);
int t2=query(mid+1,r,sl,sr,rs);
return max(t1,t2);
}
}
int main()
{
int n,x,y,pos1,i;
double pos2,val,a,b;
while(scanf("%d",&n)==1&&n)
{
char op[2];
build(100,200,1);
while(n--)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%d%lf%lf",&pos1,&pos2,&val);
x=(int)((pos2+1e-9)*10);
y=(int)((val+1e-9)*10);
update(pos1,x,y,1);
}
else
{
scanf("%d%d%lf%lf",&x,&y,&a,&b);
int aa=(int)((a+1e-9)*10);
int bb=(int)((b+1e-9)*10);
if(x>y)
swap(x,y);
if(aa>bb)
swap(aa,bb);
int ans=query(x,y,aa,bb,1);
if(ans<0)
{
printf("-1\n");
continue;
}
double ans1=ans*1.0/10;
printf("%.1f\n",ans1);
}
}
}
return 0;
}
/*
2
I 170 69.3 96.5
Q 144 184 38.3 69.2
*/