題目背景 很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。 題目描述 不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績 輸入輸出格式 輸入格式: 第一行,有兩個正整數 N 和 ...
題目背景
很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。
題目描述
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績
輸入輸出格式
輸入格式:
第一行,有兩個正整數 N 和 M ( 0<N<=200000,0<M<5000 ),分別代表學生的數目和操作的數目。學生ID編號分別從1編到N。第二行包含N個整數,代表這N個學生的初始成績,其中第i個數代表ID為i的學生的成績。接下來有M行。每一行有一個字元 C (只取'Q'或'U') ,和兩個正整數A,B。當C為'Q'的時候,表示這是一條詢問操作,它詢問ID從A到B(包括A,B)的學生當中,成績最高的是多少。當C為'U'的時候,表示這是一條更新操作,如果當前A學生的成績低於B,則把ID為A的學生的成績更改為B,否則不改動。
輸出格式:
對於每一次詢問操作,在一行裡面輸出最高成績
輸入輸出樣例
輸入樣例#1:5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5輸出樣例#1:
5 6 5 9
線段樹區間查詢+單點修改
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<algorithm> 7 #define ls k<<1 8 #define rs k<<1|1 9 using namespace std; 10 const int MAXN=2000001; 11 void read(int &n) 12 { 13 char c='+';int x=0;bool flag=0; 14 while(c<'0'||c>'9') 15 {c=getchar();if(c=='-')flag=1;} 16 while(c>='0'&&c<='9') 17 {x=x*10+c-48,c=getchar();} 18 flag==1?n=-x:n=x; 19 } 20 int n,m; 21 int ans=-1; 22 struct node 23 { 24 int l,r,w; 25 }tree[MAXN*4]; 26 void update(int k) 27 { 28 tree[k].w=max(tree[ls].w,tree[rs].w); 29 } 30 void build_tree(int ll,int rr,int k) 31 { 32 tree[k].l=ll;tree[k].r=rr; 33 if(ll==rr) 34 { 35 read(tree[k].w); 36 return ; 37 } 38 int mid=(ll+rr)>>1; 39 build_tree(ll,mid,ls); 40 build_tree(mid+1,rr,rs); 41 update(k); 42 } 43 void query(int ll,int rr,int k) 44 { 45 if(ll>tree[k].r||rr<tree[k].l) 46 return ; 47 if(ll<=tree[k].l&&tree[k].r<=rr) 48 { 49 ans=max(ans,tree[k].w); 50 return ; 51 } 52 int mid=(tree[k].l+tree[k].r)>>1; 53 query(ll,rr,ls); 54 query(ll,rr,rs); 55 } 56 void change(int pos,int v,int k) 57 { 58 if(pos>tree[k].r||pos<tree[k].l) 59 return ; 60 if(tree[k].l==tree[k].r) 61 { 62 tree[k].w=v; 63 return ; 64 } 65 change(pos,v,ls); 66 change(pos,v,rs); 67 update(k); 68 } 69 int main() 70 { 71 read(n);read(m); 72 build_tree(1,n,1); 73 for(int i=1;i<=m;i++) 74 { 75 string s; 76 cin>>s; 77 if(s[0]=='Q')// 查詢 78 { 79 int l,r; 80 read(l);read(r); 81 ans=0; 82 query(l,r,1); 83 printf("%d\n",ans); 84 } 85 else 86 { 87 int x,y; 88 read(x);read(y); 89 ans=0; 90 query(x,x,1); 91 if(ans<y) 92 change(x,y,1); 93 } 94 } 95 return 0; 96 }