线段树(updata+query)

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。
 

 

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 cin
 1 /*******************************
 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 }

 

posted @ 2015-11-17 22:38  御心飞行  阅读(234)  评论(0编辑  收藏  举报