(线段树 区间最大,单点更新) I Hate It

B - I Hate It

Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<cstdlib>
using namespace std;
#define N 200010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 0x7fffffff
int n,m,sum[N<<2],maxx[N<<2],ans;
void pushup(int rt)
{
      maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);
}
void build(int l,int r,int rt)
{
      if(l==r)
      {
            maxx[rt]=sum[l];
            return ;
      }
      int m=(l+r)>>1;
      build(lson);
      build(rson);
      pushup(rt);
}
void query(int L,int R,int l,int r,int rt)
{
      if(L<=l&&r<=R)
      {
          ans=max(maxx[rt],ans);
          return ;
      }
      int m=(l+r)>>1,ret=0;
      if(L<=m) query(L,R,lson);
      if(m<R) query(L,R,rson);
}
void add(int x,int c,int l,int r,int rt)
{
      if(l==x&&r==x)
      {
            maxx[rt]=c;
            return ;
      }
      int m=(l+r)>>1;
      if(x<=m) add(x,c,lson);
      else add(x,c,rson);
      pushup(rt);
}
int main()
{
      while(scanf("%d%d",&n,&m)!=EOF)
      {
            for(int i=1;i<=n;i++)
                  scanf("%d",&sum[i]);
            build(1,n,1);
            char s[5];
            int x,y;
            while(m--)
            {
                  scanf("%s",s);
                  scanf("%d%d",&x,&y);
                  if(s[0]==‘Q‘)
                  {
                        ans=0;
                        query(x,y,1,n,1);
                        printf("%d\n",ans);
                  }
                  else if(s[0]==‘U‘)
                  {
                        add(x,y,1,n,1);
                  }
            }
      }
      return 0;
}

  

时间: 2024-07-29 16:25:22

(线段树 区间最大,单点更新) I Hate It的相关文章

hdu 1116 敌兵布阵 线段树 区间求和 单点更新

线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 using namespace std; const int MAXN = 50008; int sum[MAXN<<2]; void build(int l, int r, int rt)

HDU 1394:Minimum Inversion Number(线段树区间求和单点更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Problem Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. For a given sequence of numbe

hdu 1166 线段树 区间求和 +单点更新 CD模板

题目链接 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 69983    Accepted Submission(s): 29354 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tid

hdu 3308 线段树 区间合并+单点更新+区间查询

LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6592    Accepted Submission(s): 2866 Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (index

hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 --------------------------------------------------------------------------------------------------------------------------------------------

POJ2886 Who Gets the Most Candies? 【线段树】+【单点更新】+【模拟】+【反素数】

Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 9416   Accepted: 2868 Case Time Limit: 2000MS Description N children are sitting in a circle to play a game. The children are numbered from 1 to N in clockwise o

HDU2795 Billboard 【线段树】+【单点更新】

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9632    Accepted Submission(s): 4286 Problem Description At the entrance to the university, there is a huge rectangular billboard of s

POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12296   Accepted: 6071 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue- The Lunar New Year wa

Wikilo 1191线段树区间修改单点查询

这题也算比较容易的了. 如果哪个区间已经没有黑色的话,就不用update了,就是因为这个原因WA了2发,唉-- #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #incl

线段树-区间单个点更新-区间和-区间最大

线段树: 图中的元素[a,b]表示该节点存储的值是在a到b内的结果(最大值或者和).其根节点为c的话,其下面两个子树节点的序号为 c*2 和 c*2+1 区间最大值 题目: Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每