I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7182 Accepted Submission(s): 2583
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 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'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
在每个测试的第一行,有两个正整数 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'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output
对于每一次询问操作,在一行里面输出最高成绩。
Sample Input
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
Sample Output
5
6
5
9
Hint
Huge input,the C function scanf() will work better than cin1 /******************************* 2 3 Date : 2015-11-17 21:40:22 4 Author : WQJ (1225234825@qq.com) 5 Link : http://www.cnblogs.com/a1225234/ 6 Name : HD1754 7 8 ********************************/ 9 #include <iostream> 10 #include <cstdio> 11 #include <algorithm> 12 #include <cmath> 13 #include <cstring> 14 #include <string> 15 #include <set> 16 #include <vector> 17 #include <queue> 18 using namespace std; 19 const int Max=200000+5; 20 int sc[Max],segTree[Max<<2]; 21 int l,r; 22 int build(int node,int begin,int end) 23 { 24 int mid=(begin+end)/2; 25 if(begin==end) segTree[node]=sc[end]; 26 else{ 27 build(node*2,begin,mid); 28 build(node*2+1,mid+1,end); 29 segTree[node]=max(segTree[node*2],segTree[node*2+1]); 30 } 31 return 0; 32 } 33 int query(int node,int begin,int end) 34 { 35 int p1,p2; 36 int mid=(begin+end)/2; 37 if(r<begin||l>end) return -1; 38 if(l<=begin&&end<=r) 39 return segTree[node]; 40 p1=query(node*2,begin,mid); 41 p2=query(node*2+1,mid+1,end); 42 if(p1==-1) return p2; 43 if(p2==-1) return p1; 44 return max(p1,p2); 45 } 46 int updata(int node,int begin,int end,int pos,int e) 47 { 48 int mid=(begin+end)/2; 49 if(begin==end) 50 { 51 segTree[node]=e; 52 return 0; 53 } 54 if(pos<=mid) 55 updata(node*2,begin,mid,pos,e); 56 else 57 updata(node*2+1,mid+1,end,pos,e); 58 segTree[node]=max(segTree[node*2],segTree[node*2+1]); 59 return 0; 60 } 61 int main() 62 { 63 int N,M; 64 int i,j,k,e; 65 char ch; 66 freopen("in.txt","r",stdin); 67 while(scanf("%d%d",&N,&M)!=EOF) 68 { 69 memset(segTree,0,sizeof(segTree)); 70 for(i=0;i<N;i++) 71 { 72 scanf("%d",&e); 73 sc[i]=e; 74 } 75 build(1,0,N-1); 76 //for(i=0;i<20;i++) 77 // cout<<segTree[i]<<" "; 78 for(i=0;i<M;i++) 79 { 80 int a,b; 81 getchar(); 82 scanf("%c%d%d",&ch,&a,&b); 83 if(ch=='Q') 84 { 85 l=a-1,r=b-1; 86 cout<<query(1,0,N-1)<<endl; 87 } 88 else if(ch=='U') 89 { 90 updata(1,0,N-1,a-1,b); 91 } 92 } 93 } 94 return 0; 95 }