using namespace std; int n,m,q; int a[maxn][maxn]; int Max[maxn<<2][maxn<<2],Min[maxn<<2][maxn<<2]; int ansmx,ansmi; int x1,y11,x2,y2,val; void push_up1(int rt1,int rt2){ Max[rt1][rt2]=max(Max[rt1<<1][rt2],Max[rt1<<1|1][rt2]); Min[rt1][rt2]=min(Min[rt1<<1][rt2],Min[rt1<<1|1][rt2]); } void push_up2(int rt1,int rt2){ Max[rt1][rt2]=max(Max[rt1][rt2<<1],Max[rt1][rt2<<1|1]); Min[rt1][rt2]=min(Min[rt1][rt2<<1],Min[rt1][rt2<<1|1]); } void buildy(int rt,int l,int r,int xrt,int x){ if(l==r){ if(x>0) Max[xrt][rt]=Min[xrt][rt]=a[x][l]; else push_up1(xrt,rt); return; } int mid=l+r>>1; buildy(lson,xrt,x); buildy(rson,xrt,x); push_up2(xrt,rt); } void buildx(int rt,int l,int r){ if(l==r){ buildy(1,1,m,rt,l); return; } int mid=l+r>>1; buildx(lson); buildx(rson); buildy(1,1,m,rt,-1); } void updatey(int rt,int l,int r,int xrt,int x){ if(l==r){ if(x>0) Max[xrt][rt]=Min[xrt][rt]=val; else push_up1(xrt,rt); return; } int mid=l+r>>1; if(mid>=y11) updatey(lson,xrt,x); else updatey(rson,xrt,x); push_up2(xrt,rt); } void updatex(int rt,int l,int r){ if(l==r){ updatey(1,1,m,rt,l); return; } int mid=l+r>>1; if(mid>=x1) updatex(lson); else updatex(rson); updatey(1,1,m,rt,-1); } void queryy(int rt,int l,int r,int xrt){ if(l>=y11 && r<=y2){ ansmx=max(ansmx,Max[xrt][rt]); ansmi=min(ansmi,Min[xrt][rt]); return; } int mid=l+r>>1; if(mid>=y11) queryy(lson,xrt); if(mid<y2) queryy(rson,xrt); } void queryx(int rt,int l,int r){ if(l>=x1 && r<=x2){ queryy(1,1,m,rt); return; } int mid=l+r>>1; if(mid>=x1) queryx(lson); if(mid<x2) queryx(rson); } char op[10]; int main(){ // freopen("input.txt","r",stdin); scanf("%d",&n); m=n; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); } mm(Max,-inf),mm(Min,inf); buildx(1,1,n); scanf("%d",&q); while(q--){ scanf("%s",op); if(op[0]=='q'){ ansmx=-inf,ansmi=inf; scanf("%d%d%d%d",&x1,&y11,&x2,&y2); queryx(1,1,n); printf("%d %d\n",ansmx,ansmi); } else{ scanf("%d%d%d",&x1,&y11,&val); updatex(1,1,n); } } return 0; }
|