HDU 1754(线段树点修改模板题)

来源:互联网 发布:java long 最大长度 编辑:程序博客网 时间:2024/06/06 00:24

HDU 1754

题目大意

不断地进行询问某个区间的最大值和修改某个数的操作

代码

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>#include<stack>using namespace std;const int INF=0x77777777;const int MAXN=200005;int n,m;int A[2000005];int maxm[4000005];void Pushup(int rt)//Pushup函数假设rt的儿子都已经更新好了,对rt进行更新{    maxm[rt]=max(maxm[rt*2],maxm[rt*2+1]);}void Build(int l,int r,int rt)//建树{    if(l==r){maxm[rt]=A[l];return ;}    int m=(l+r)/2;    Build(l,m,rt*2);    Build(m+1,r,rt*2+1);    Pushup(rt);}void Update(int X,int C,int l,int r,int rt)//将某个节点X修改为C{    if(l==r){maxm[rt]=C;return ;}    int m=(l+r)/2;    if(X<=m)Update(X,C,l,m,rt*2);    else Update(X,C,m+1,r,rt*2+1);    Pushup(rt);}int Query(int L,int R,int l,int r,int rt)//L R为查询区间,该函数返回(L,R)与(l,r)交集中的最大值{    int ans=-INF;    int m=(l+r)/2;    if(L<=l && r<=R)return maxm[rt];    if(L<=m)ans=max(ans,Query(L,R,l,m,rt*2));    if(R>m)ans=max(ans,Query(L,R,m+1,r,rt*2+1));    return ans;}int main(){    int a,b;    char c;    while(scanf("%d%d",&n,&m)!=EOF)    {          for(int i=1;i<=n;i++)scanf("%d",&A[i]);          Build(1,n,1);          for(int i=1;i<=m;i++)          {               scanf("%c",&c);               while(c=='\n')scanf("%c",&c);               scanf("%d%d",&a,&b);               if(c=='Q')printf("%d\n",Query(a,b,1,n,1));               else if(c=='U'){Update(a,b,1,n,1);}          }    }    return 0;}
0 0
原创粉丝点击