第一次尝试不用二维数组的二维线段树,自己yy的代码
#include<bits/stdc++.h>
using namespace std;
const int N=505,INF=2e9;
struct QK{
int ma,mi;
};
int n;
int a[N][N];
void merge(QK &x,QK l,QK r){
x.ma=max(l.ma,r.ma);
x.mi=min(l.mi,r.mi);
}
struct segmenttree{
#define ls x<<1
#define rs x<<1|1
QK s[N<<2];
void build(int x,int l,int r){
s[x].mi=INF;
s[x].ma=-INF;
if(l==r){
cin>>s[x].mi;
s[x].ma=s[x].mi;
return;
}
int mid=l+r>>1;
build(ls,l,mid);build(rs,mid+1,r);
merge(s[x],s[ls],s[rs]);
}
void upd(int x,int l,int r,int p,int v){
if(l==r){
s[x].ma=s[x].mi=v;
return;
}
int mid=l+r>>1;
if(p<=mid) upd(ls,l,mid,p,v);
else upd(rs,mid+1,r,p,v);
merge(s[x],s[ls],s[rs]);
}
QK query(int x,int l,int r,int xl,int xr){
if(xl<=l&&xr>=r){
return s[x];
}
int mid=l+r>>1;
QK res;
res.mi=INF;
if(xl<=mid) res=query(ls,l,mid,xl,xr);
if(xr>mid){
QK tmp=query(rs,mid+1,r,xl,xr);
merge(res,res,tmp);
}
return res;
}
}s[N<<2];
void pushup(segmenttree &o,segmenttree &lc,segmenttree &rc,int x,int l,int r){
merge(o.s[x],lc.s[x],rc.s[x]);
if(l==r) return;
int mid=l+r>>1;
pushup(o,lc,rc,ls,l,mid);pushup(o,lc,rc,rs,mid+1,r);
}
void build(int x,int l,int r){
if(l==r){
s[x].build(1,1,n);
return;
}
int mid=l+r>>1;
build(ls,l,mid);build(rs,mid+1,r);
pushup(s[x],s[ls],s[rs],1,1,n);
}
void upd(int x,int l,int r,int xxx,int yyy,int v){
if(l==r){
s[x].upd(1,1,n,yyy,v);
return;
}
int mid=l+r>>1;
if(mid>=xxx) upd(ls,l,mid,xxx,yyy,v);
else upd(rs,mid+1,r,xxx,yyy,v);
pushup(s[x],s[ls],s[rs],1,1,n);
}
QK query(int x,int l,int r,int xxx,int yyy,int xx,int yy){
if(xxx<=l&&xx>=r){
return s[x].query(1,1,n,yyy,yy);
}
int mid=l+r>>1;
QK res;
res.mi=INF;res.ma=-INF;
if(xxx<=mid) res=query(ls,l,mid,xxx,yyy,xx,yy);
if(xx>mid){
QK tmp=query(rs,mid+1,r,xxx,yyy,xx,yy);
merge(res,res,tmp);
}
return res;
}
int Q;
int main(){
cin>>n;
build(1,1,n);
cin>>Q;
while(Q--){
char ch;
int xxx,yyy,x2,y2,v;
cin>>ch>>xxx>>yyy;
if(ch=='q'){
cin>>x2>>y2;
QK ans=query(1,1,n,xxx,yyy,x2,y2);
cout<<ans.ma<<" "<<ans.mi<<endl;
}
else{
cin>>v;
upd(1,1,n,xxx,yyy,v);
}
}
return 0;
}