uva11297 二维线段树

来源:互联网 发布:数据化人生 编辑:程序博客网 时间:2024/05/19 22:50

询问矩阵内一块矩阵的最值和单点修改。

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#include<iomanip>#include<map>#include<algorithm>#include<queue>#include<set>#define inf 1000000000#define pi acos(-1.0)#define eps 1e-8#define seed 131using namespace std;typedef pair<int,int> pii;typedef unsigned long long ull;typedef long long ll;const int maxn=100005;int n,Q;int Min[2005][2005];int Max[2005][2005];int xo,xleaf;int X1,Y1,X2,Y2,v;int vmax,vmin;int a;void build1D(int l,int r,int rt){    if(l==r) {        if(xleaf) {            scanf("%d",&a);            Max[xo][rt]=Min[xo][rt]=a;        }        else {            Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]);            Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]);        }        return;    }    int m=(l+r)/2;    build1D(l,m,rt<<1);    build1D(m+1,r,rt<<1|1);    Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]);    Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]);}void build2D(int l,int r,int rt){    if(l==r) {        xo=rt;        xleaf=1;        build1D(1,n,1);        return;    }    int m=(l+r)/2;    build2D(l,m,rt<<1);    build2D(m+1,r,rt<<1|1);    xo=rt;    xleaf=0;    build1D(1,n,1);}void query1D(int l,int r,int L,int R,int rt){    if(l<=L&&r>=R) {        vmin=min(vmin,Min[xo][rt]);        vmax=max(vmax,Max[xo][rt]);        return;    }    int m=(L+R)/2;    if(l<=m) {        query1D(l,r,L,m,rt<<1);    }    if(r>m) {        query1D(l,r,m+1,R,rt<<1|1);    }}void query2D(int l,int r,int L,int R,int rt){    if(l<=L&&r>=R) {        xo=rt;        query1D(Y1,Y2,1,n,1);        return;    }    int m=(L+R)/2;    if(l<=m) {        query2D(l,r,L,m,rt<<1);    }    if(r>m) {        query2D(l,r,m+1,R,rt<<1|1);    }}void update1D(int y,int L,int R,int rt){    if(L==y&&R==y) {        if(xleaf) {            Min[xo][rt]=Max[xo][rt]=v;            return;        }        else {            Min[xo][rt]=min(Min[xo<<1][rt],Min[xo<<1|1][rt]);            Max[xo][rt]=max(Max[xo<<1][rt],Max[xo<<1|1][rt]);        }        return;    }    int m=(L+R)/2;    if(y<=m) {        update1D(y,L,m,rt<<1);    }    else {        update1D(y,m+1,R,rt<<1|1);    }    Min[xo][rt]=min(Min[xo][rt<<1],Min[xo][rt<<1|1]);    Max[xo][rt]=max(Max[xo][rt<<1],Max[xo][rt<<1|1]);}void update2D(int x,int L,int R,int rt){    if(x==L&&x==R) {        xo=rt;        xleaf=1;        update1D(Y1,1,n,1);        return;    }    int m=(L+R)/2;    if(x<=m) {        update2D(x,L,m,rt<<1);    }    else {        update2D(x,m+1,R,rt<<1|1);    }    xo=rt;    xleaf=0;    update1D(Y1,1,n,1);}int main(){    char op[2];    scanf("%d",&n);    build2D(1,n,1);    scanf("%d",&Q);    for(int i=0;i<Q;i++) {        scanf("%s",op);        if(op[0]=='q') {            scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2);            vmax=0;            vmin=inf;            query2D(X1,X2,1,n,1);            printf("%d %d\n",vmax,vmin);        }        else {            scanf("%d%d%d",&X1,&Y1,&v);            update2D(X1,1,n,1);        }    }    return 0;}


0 0