区间 查询+单点修改
注意二维添加操作
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=205;
const int MAXM=1005;
struct node
{
int l,r,max;
};
struct tree
{
node sub[4*MAXM];
int l,r;
}s[4*MAXN];
int a[MAXN][MAXM];
void build_(int l,int r,int x,int fax,int fal,int far)
{
s[fax].sub[x].l=l;
s[fax].sub[x].r=r;
if (l==r)
{
if (fal==far)
s[fax].sub[x].max=a[fal][l];
else
s[fax].sub[x].max=max(s[2*fax].sub[x].max,s[2*fax+1].sub[x].max);
return;
}
int mid=(l+r)>>1;
build_(l,mid,2*x,fax,fal,far);
build_(mid+1,r,2*x+1,fax,fal,far);
s[fax].sub[x].max=max(s[fax].sub[2*x].max,s[fax].sub[2*x+1].max);
}
void build(int l,int r,int x,int l_,int r_)
{
s[x].l=l;
s[x].r=r;
if (l==r)
{
build_(l_,r_,1,x,l,r);
return;
}
int mid=(l+r)>>1;
build(l,mid,2*x,l_,r_);
build(mid+1,r,2*x+1,l_,r_);
build_(l_,r_,1,x,l,r);
}
int query_(int l,int r,int x,int fax)
{
if (s[fax].sub[x].l==l&&s[fax].sub[x].r==r)
return s[fax].sub[x].max;
if (r<=s[fax].sub[2*x].r)
return query_(l,r,2*x,fax);
else if (l>=s[fax].sub[2*x+1].l)
return query_(l,r,2*x+1,fax);
else
return max(query_(l,s[fax].sub[2*x].r,2*x,fax),query_(s[fax].sub[2*x+1].l,r,2*x+1,fax));
}
int query(int l,int r,int x,int l_,int r_)
{
if (s[x].l==l&&s[x].r==r)
return query_(l_,r_,1,x);
if (r<=s[2*x].r)
return query(l,r,2*x,l_,r_);
else if (l>=s[2*x+1].l)
return query(l,r,2*x+1,l_,r_);
else
return max(query(l,s[2*x].r,2*x,l_,r_),query(s[2*x+1].l,r,2*x+1,l_,r_));
}
void add_(int pos2,int x,int change,int fax)
{
if (s[fax].sub[x].l==s[fax].sub[x].r)
{
s[fax].sub[x].max=max(change,s[fax].sub[x].max);
return ;
}
if (pos2<=s[fax].sub[2*x].r)
add_(pos2,2*x,change,fax);
else if (pos2>=s[fax].sub[2*x+1].l)
add_(pos2,2*x+1,change,fax);
s[fax].sub[x].max=max(s[fax].sub[2*x].max,s[fax].sub[2*x+1].max);
}
void add(int pos1,int x,int pos2,int change)
{
add_(pos2,1,change,x);
if (s[x].l==s[x].r) return;
if (pos1<=s[2*x].r)
add(pos1,2*x,pos2,change);
else if (pos1>=s[2*x+1].l)
add(pos1,2*x+1,pos2,change);
}
int main()
{
int i,j,m,l,r,h;
double tl,tr,hap,lov;
char k;
while (scanf("%d",&m)==1&&m)
{
for (i=100;i<=200;i++)
for (j=0;j<=1000;j++)
a[i][j]=-1;
build(100,200,1,0,1000);
while (m--)
{
cin>>k;
if (k=='Q')
{
scanf("%d%d%lf%lf",&l,&r,&tl,&tr);
if (l>r) swap(l,r);
if (tl>tr) swap(tl,tr);
int ans=query(l,r,1,int(tl*10),int(tr*10));
if (ans==-1)
printf("%d\n",ans);
else
printf("%.1lf\n",ans/10.0);
}
else
{
scanf("%d%lf%lf",&h,&hap,&lov);
add(h,1,int(hap*10),int(lov*10));
}
}
}
return 0;
}