I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 27606 Accepted Submission(s): 10956
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。
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
线段树的单点更新,区间查询:

1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <string.h> 5 #include <math.h> 6 using namespace std; 7 #define ll long long int 8 ll a[800000]; 9 void build(int b,int c,int x) 10 { 11 if(b==c) 12 { 13 scanf("%d",&a[x]); 14 return ; 15 } 16 int m=(b+c)>>1; 17 build(b,m,x<<1); 18 build(m+1,c,x<<1|1); 19 a[x]=max(a[x<<1],a[x<<1|1]); 20 } 21 void update(int x,int y,int b,int c,int t) 22 { 23 if(b==c) 24 { 25 a[t]=y; 26 return; 27 } 28 int m=(b+c)>>1; 29 if(x<=m) update(x,y,b,m,t<<1); 30 else update(x,y,m+1,c,t<<1|1); 31 a[t]=max(a[t<<1],a[t<<1|1]); 32 } 33 int fun(int x,int y,int b,int c,int t) 34 { 35 if(x<=b&&y>=c) 36 { 37 return a[t]; 38 } 39 int m=(b+c)>>1; 40 int r=0; 41 if(x<=m) r=fun(x,y,b,m,t<<1); 42 if(y>m) r=max(r,fun(x,y,m+1,c,t<<1|1)); 43 return r; 44 } 45 int main() 46 { 47 //freopen("int.txt","r",stdin); 48 int n,k,x,y; 49 int i; 50 while(~scanf("%d%d",&n,&k)) 51 { 52 memset(a,0,sizeof(a)); 53 build(1,n,1); 54 char s; 55 for(i=0;i<k;i++) 56 { 57 cin>>s; 58 scanf("%d%d",&x,&y); 59 if(s=='U') 60 { 61 update(x,y,1,n,1); 62 } 63 else 64 { 65 cout<<fun(x,y,1,n,1)<<endl; 66 } 67 } 68 } 69 }