【POJ2155】Matrix 二维线段树点修改区间查询

//模版题咯。。。
#include
#include
#include
using namespace std;
int f1[3205][3205],f2[3205][3205],n,m,x,y,X1,X2,Y1,Y2,a[810][810],xro,maxa,mina,L,t;
bool xflag;
void ins_1D(int ro,int l,int r){
	if (l==r){
		if (xflag) {
			f1[xro][ro]=f2[xro][ro]=a[x][y];
			return ;
		}
		f1[xro][ro]=max(f1[xro*2][ro],f1[xro*2+1][ro]);
		f2[xro][ro]=min(f2[xro*2][ro],f2[xro*2+1][ro]);
		return ;
	}
	int mid=l+((r-l)>>1);
	if (y<=mid) ins_1D(ro*2,l,mid);
	else ins_1D(ro*2+1,mid+1,r);
	f1[xro][ro]=max(f1[xro][ro*2],f1[xro][ro*2+1]);
	f2[xro][ro]=min(f2[xro][ro*2],f2[xro][ro*2+1]);
}
void ins_2D(int ro,int l,int r){
	if (l==r) {
		xro=ro;xflag=1;ins_1D(1,1,n);
	}
	else {
		int mid=l+((r-l)>>1);//为什么用这种写法?不会加爆! 
		if (x<=mid) ins_2D(ro*2,l,mid);
		else ins_2D(ro*2+1,mid+1,r);
		xro=ro;xflag=0;ins_1D(1,1,n);
	}
}
void query_1D(int ro,int l,int r){
	if (Y1<=l&&r<=Y2){
		maxa=max(f1[xro][ro],maxa);
		mina=min(f2[xro][ro],mina);
		return ;
	}
	int mid=l+((r-l)>>1);
	if (mid>=Y1) query_1D(ro*2,l,mid);
	if (mid>1);
	if (mid>=X1) query_2D(ro*2,l,mid);
	if (mid>1);
			ins_2D(1,1,n);
			printf("%d\n",a[x][y]);
		}
	}
} 


你可能感兴趣的:(水题,模版,省选,数据结构,线段树,二位线段树)