二维线段树UVA11297

来源:互联网 发布:linux硬件时间 编辑:程序博客网 时间:2024/06/06 13:05
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;#define nn 505#define inf 0x7fffffffint ma[nn<<2][nn<<2],mi[nn<<2][nn<<2];int x,y,xo,xleaf,v,x1,x2,y1,y2;int n,m,vmax,vmin;void query1(int l,int r,int rt){    if(y1<=l&&y2>=r)    {        vmax=max(ma[xo][rt],vmax);        vmin=min(mi[xo][rt],vmin);        return;    }    int mid=(l+r)>>1;    if(y1<=mid) query1(l,mid,rt<<1);    if(y2>mid) query1(mid+1,r,rt<<1|1);}void query2(int l,int r,int rt){    if(x1<=l && x2>=r)    {        xo=rt;        query1(1,m,1);        return;    }    int mid=(l+r)>>1;    if(mid>=x1) query2(l,mid,rt<<1);    if(x2>mid) query2(mid+1,r,rt<<1|1);}void updata1(int l,int r,int rt){    if(l==r)    {        if(xleaf)        {            ma[xo][rt]=mi[xo][rt]=v;            return;        }        ma[xo][rt]=max(ma[xo][rt<<1],ma[xo][rt<<1|1]);        mi[xo][rt]=min(mi[xo][rt<<1],mi[xo][rt<<1|1]);        return;    }    int mid=(l+r)>>1;    if(y<=mid)  updata1(l,mid,rt<<1);    else updata1(mid+1,r,rt<<1|1);    ma[xo][rt]=max(ma[xo][rt<<1],ma[xo][rt<<1|1]);    mi[xo][rt]=min(mi[xo][rt<<1],mi[xo][rt<<1|1]);}void updata2(int l,int r,int rt){    if(l==r)    {        xo=rt;        xleaf=1;        updata1(1,m,1);        return;    }    int mid=(l+r)>>1;    if(x<=mid)   updata2(l,mid,rt<<1);    else updata2(mid+1,r,rt<<1|1);    xo=rt;  xleaf=0;    updata1(1,m,1);}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                scanf("%d",&v);                x=i;    y=j;                updata2(1,n,1);            }        }        int q;        scanf("%d",&q);        while(q--)        {            char s[10];            scanf("%s",s);            if(s[0]=='q')            {                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);                vmax=-inf; vmin=inf;                query2(1,n,1);                printf("%d %d\n",vmax,vmin);            }            else            {                scanf("%d%d%d",&x,&y,&v);                updata2(1,n,1);            }        }    }    return 0;}

0 0
原创粉丝点击