点更新区间查询模板 但有两个坑
1 左右端点大小未定 需要判断 这个已经见怪不怪
2 精度问题 要用float
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
float maxx[810][4010];
float ans;
int n,c,q;
void pushupy(int curx,int cury)
{
maxx[curx][cury]=max(maxx[curx][cury*2],maxx[curx][cury*2+1]);
return;
}
void pushupx(int tary,int l,int r,int curx,int cury)
{
int m;
maxx[curx][cury]=max(maxx[curx*2][cury],maxx[curx*2+1][cury]);
if(l==r) return;
m=(l+r)/2;
if(tary<=m) pushupx(tary,l,m,curx,cury*2);
else pushupx(tary,m+1,r,curx,cury*2+1);
return;
}
void queryy(int yl,int yr,int l,int r,int curx,int cury)
{
int m;
if(yl<=l&&r<=yr)
{
ans=max(ans,maxx[curx][cury]);
return;
}
m=(l+r)/2;
if(yl<=m) queryy(yl,yr,l,m,curx,cury*2);
if(yr>=m+1) queryy(yl,yr,m+1,r,curx,cury*2+1);
return;
}
void queryx(int xl,int xr,int yl,int yr,int l,int r,int curx)
{
int m,res;
if(xl<=l&&r<=xr)
{
queryy(yl,yr,0,c,curx,1);
return;
}
m=(l+r)/2;
if(xl<=m) queryx(xl,xr,yl,yr,l,m,curx*2);
if(xr>=m+1) queryx(xl,xr,yl,yr,m+1,r,curx*2+1);
return;
}
void updatey(int tary,float val,int l,int r,int curx,int cury)
{
int m;
if(l==r)
{
maxx[curx][cury]=max(maxx[curx][cury],val);
return;
}
m=(l+r)/2;
if(tary<=m) updatey(tary,val,l,m,curx,cury*2);
else updatey(tary,val,m+1,r,curx,cury*2+1);
pushupy(curx,cury);
return;
}
void updatex(int tarx,int tary,float val,int l,int r,int curx)
{
int m;
if(l==r)
{
updatey(tary,val,0,c,curx,1);
return;
}
m=(l+r)/2;
if(tarx<=m) updatex(tarx,tary,val,l,m,curx*2);
else updatex(tarx,tary,val,m+1,r,curx*2+1);
pushupx(tary,0,c,curx,1);
return;
}
int main()
{
float y1,y2,val,t1;
int x1,x2,t2;
int i,j,xl,xr,yl,yr;
char op[10];
while(scanf("%d",&q)!=EOF)
{
if(q==0) break;
for(i=1;i<=800;i++)
{
for(j=0;j<=4000;j++)
{
maxx[i][j]=-1.0;
}
}
n=200,c=1000;
for(i=1;i<=q;i++)
{
scanf("%s",op);
if(op[0]=='I')
{
scanf("%d%f%f",&x1,&y1,&val);
y1*=10.0;
updatex(x1,y1,val,1,n,1);
}
else
{
scanf("%d%d%f%f",&x1,&x2,&y1,&y2);
y1*=10.0,y2*=10.0;
if(x1>x2) t2=x1,x1=x2,x2=t2;
if(y1>y2) t1=y1,y1=y2,y2=t1;
ans=-1.0;
queryx(x1,x2,y1,y2,1,n,1);
if(ans!=-1.0)
{
printf("%.1f\n",ans);//
}
else printf("-1\n");
}
}
}
return 0;
}