最高分

输入包含多组测试数据。
每组输入第一行是两个正整数N和M(0<N<=30000,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。

#include<bits/stdc++.h>

using namespace std;

struct node

{

         int l,r,f;int zhi;

}a[120001];

int n,m,b[30001],x,y,z;char u;

void build(int k,int l,int r)

{

         a[k].l=l;a[k].r=r;

         if(l==r)

         {

                   a[k].zhi=b[l];

                   return;

         }

         int mid=(l+r)/2;

         build(k*2,l,mid);

         build(k*2+1,mid+1,r);

         a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);

}

void add(int k,int x,int zhi)

{

         if(a[k].l==a[k].r)

         {

                   a[k].zhi=zhi;

                   return;

         }

         int mid=(a[k].l+a[k].r)/2;

         if(mid>=x)

         {

                   add(k*2,x,zhi);

         }

         else

         add(k*2+1,x,zhi);

         a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);

}

int find(int k,int l,int r)

{

         if(a[k].l>=l&&a[k].r<=r)

         {

                   return a[k].zhi;

         }

         int ans=-199009999,mid=(a[k].l+a[k].r)/2;

         if(mid>=l)

         {

                   ans=max(ans,find(k*2,l,r));

         }

         if(mid<r)

         {

                   ans=max(ans,find(k*2+1,l,r));

         }

         return ans;

}

int main()

{

         while(cin>>n>>m)

         {

                   memset(b,0,sizeof(b));

                   memset(a,0,sizeof(a));

                   for(int i=1;i<=n;i++)

                   {

                            cin>>b[i];

                   }

                   build(1,1,n);

                   for(int i=0;i<m;i++)

                   {

                            cin>>u;

                            if(u=='U')

                            {

                                     cin>>x>>y;

                                     add(1,x,y);

                            }

                            if(u=='Q')

                            {

                                     cin>>x>>y;

                                     cout<<find(1,x,y)<<endl;

                            }

                   }

         }

}

猜你喜欢

转载自www.cnblogs.com/fanhao050109/p/10939396.html