UVa11297 Census

二维线段树

单点修改,区间查询最值。

 

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #define ls l,mid,rt<<1
 8 #define rs mid+1,r,rt<<1|1
 9 using namespace std;
10 const int mxn=510;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
14     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
15     return x*f;
16 }
17 struct node{
18     int mx,mini;
19 }t[mxn<<2][mxn<<2];
20 int ansmx,ansmi;
21 int n,m;
22 void updateY(int y,int w,int l,int r,int rt,int px){
23     if(l==r){
24         if(w!=1e9+7){
25             t[px][rt].mini=t[px][rt].mx=w;
26         }
27         else{
28             t[px][rt].mini=min(t[px<<1][rt].mini,t[px<<1|1][rt].mini);
29             t[px][rt].mx=max(t[px<<1][rt].mx,t[px<<1|1][rt].mx);
30         }
31         return;
32     }
33     int mid=(l+r)>>1;
34     if(y<=mid)updateY(y,w,ls,px);
35     else updateY(y,w,rs,px);
36     t[px][rt].mini=min(t[px][rt<<1].mini,t[px][rt<<1|1].mini);
37     t[px][rt].mx=max(t[px][rt<<1].mx,t[px][rt<<1|1].mx);
38     return;
39 }
40 void updateX(int x,int y,int w,int l,int r,int rt){
41     if(l==r){
42         updateY(y,w,1,n,1,rt);
43         return;
44     }
45     int mid=(l+r)>>1;
46     if(x<=mid)updateX(x,y,w,ls);
47     else updateX(x,y,w,rs);
48     updateY(y,1e9+7,1,n,1,rt);
49     return;
50 }
51 void queryY(int L,int R,int l,int r,int rt,int px){
52     if(L<=l && r<=R){
53         ansmi=min(ansmi,t[px][rt].mini);
54         ansmx=max(ansmx,t[px][rt].mx);
55         return;
56     }
57     int mid=(l+r)>>1;
58     if(L<=mid)queryY(L,R,ls,px);
59     if(R>mid)queryY(L,R,rs,px);
60     return;
61 }
62 void queryX(int L,int yy1,int R,int yy2,int l,int r,int rt){
63     if(L<=l && r<=R){
64         queryY(yy1,yy2,1,n,1,rt);
65         return;
66     }
67     int mid=(l+r)>>1;
68     if(L<=mid)queryX(L,yy1,R,yy2,ls);
69     if(R>mid)queryX(L,yy1,R,yy2,rs);
70     return;
71 }
72 int main(){
73     int i,j,x,y,l,r,w;
74     n=read();
75     for(i=1;i<=n;i++){
76         for(j=1;j<=n;j++){
77             x=read();
78             updateX(i,j,x,1,n,1);
79         }
80     }
81     m=read();
82     char op[5];
83     while(m--){
84         scanf("%s",&op);
85         if(op[0]=='q'){
86             x=read();l=read();y=read();r=read();
87             ansmx=-1e9;ansmi=1e9;
88             queryX(x,l,y,r,1,n,1);
89             printf("%d %d\n",ansmx,ansmi);
90         }
91         else{
92             x=read();y=read();w=read();
93             updateX(x,y,w,1,n,1);
94         }
95     }
96     return 0;
97 }

 

posted @ 2017-01-24 22:19  SilverNebula  阅读(132)  评论(0编辑  收藏  举报
AmazingCounters.com