很基础的二维线段树,为了有点挑战性,加了离散化同时将更新合并了。。。
ACcode:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::sort;
using std::swap;
const int nsize=111111;
const int msize=222;
struct Node
{
int h,a,v,op;
int h1,h2,a1,a2;
}qu[nsize];
int maxs[msize<<2][4444],H,A;
int *p[nsize<<2],*q[nsize<<2];
bool cmp(int *a1,int *a2)
{
return *a1<*a2;
}
int Max(int a1,int a2)
{
return a1>a2?a1:a2;
}
void update(int rh,int ra,int d,int u,int l,int r,int h,int a,int v)
{
if (u==d)
{
if (l==r)
{
maxs[rh][ra]=Max(maxs[rh][ra],v);
return ;
}
int m=(l+r)>>1;
if (a<=m) update(rh,ra<<1,d,u,l,m,h,a,v);
else update(rh,ra<<1|1,d,u,m+1,r,h,a,v);
maxs[rh][ra]=Max(maxs[rh][ra<<1],maxs[rh][ra<<1|1]);
}
else
{
update(rh,1,1,1,1,A,h,a,v);
int m=(u+d)>>1;
if (h<=m) update(rh<<1,ra,d,m,l,r,h,a,v);
else update(rh<<1|1,ra,m+1,u,l,r,h,a,v);
maxs[rh][ra]=Max(maxs[rh<<1][ra],maxs[rh<<1|1][ra]);
}
}
int query(int rh,int ra,int d,int u,int l,int r,int D,int U,int L,int R)
{
int ans=-1;
if (D<=d&&u<=U)
{
if (L<=l&&r<=R) return maxs[rh][ra];
int m=(l+r)>>1;
if (L<=m) ans=Max(ans,query(rh,ra<<1,d,u,l,m,D,U,L,R));
if (R>m) ans=Max(ans,query(rh,ra<<1|1,d,u,m+1,r,D,U,L,R));
}
else
{
int m=(d+u)>>1;
if (D<=m) ans=Max(ans,query(rh<<1,ra,d,m,l,r,D,U,L,R));
if (U>m) ans=Max(ans,query(rh<<1|1,ra,m+1,u,l,r,D,U,L,R));
}
return ans;
}
int main()
{
int i,j,k,m,t,h1,h2,na,nh;
double a1,a2,L;
char op[55];
while (scanf("%d",&m)&&m)
{
na=nh=0;
for (i=0; i<m; i++)
{
scanf("%s",op);
qu[i].op= op[0]=='I'? 1:0;
if (op[0]=='I')
{
scanf("%d %lf %lf",&h1,&a1,&L);
a1*=10,L*=10;
qu[i].h=h1;
qu[i].a=int(a1);
qu[i].v=int(L);
p[nh++]=&qu[i].h;
q[na++]=&qu[i].a;
}
else
{
scanf("%d %d %lf %lf",&h1,&h2,&a1,&a2);
a1*=10,a2*=10;
if (h1>h2) swap(h1,h2);
if (a1>a2) swap(a1,a2);
qu[i].h1=h1;
qu[i].h2=h2;
qu[i].a1=int(a1);
qu[i].a2=int(a2);
p[nh++]=&qu[i].h1;
p[nh++]=&qu[i].h2;
q[na++]=&qu[i].a1;
q[na++]=&qu[i].a2;
}
}
sort(p,p+nh,cmp);
sort(q,q+na,cmp);
t=*p[0],*p[0]=1;
for (H=i=1; i<nh; i++)
{
if (*p[i]!=t) t=*p[i],++H;
*p[i]=H;
}
t=*q[0],*q[0]=1;
for (A=i=1; i<na; i++)
{
if (*q[i]!=t) t=*q[i],++A;
*q[i]=A;
}
memset(maxs,-1,sizeof(maxs));
for (i=0; i<m; i++)
{
if (qu[i].op)
{
update(1,1,1,H,1,A,qu[i].h,qu[i].a,qu[i].v);
}
else
{
t=query(1,1,1,H,1,A,qu[i].h1,qu[i].h2,qu[i].a1,qu[i].a2);
if (t>=0) printf("%.1lf\n",(double)t/10.0);
else printf("-1\n");
}
}
}
return 0;
}