标签:
链接:点击打开链接
题意:本题目包含多组测试,请处理到文件结束,
在每个测试的第一行,有两个正整数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.
对于每一次询问操作,在一行里面输出最高成绩
代码:
#include <iostream> #include <stdio.h> #include <algorithm> int node[2000000]; using namespace std; void update(int pos,int l,int r,int id,int x){ int mid; if(l==r){ node[pos]=x; return; } mid=(l+r)/2; if(id<=mid)update(2*pos,l,mid,id,x); else update(2*pos+1,mid+1,r,id,x); node[pos]=max(node[pos*2],node[pos*2+1]); //回溯时比较大小 } int question(int pos,int l,int r,int ll,int rr){ int mid,sum=0; if(ll<=l&&rr>=r) return node[pos]; mid=(l+r)/2; if(ll<=mid)sum=max(sum,question(2*pos,l,mid,ll,rr)); if(rr>mid)sum=max(sum,question(2*pos+1,mid+1,r,ll,rr)); return sum; } //线段树模板 int a[200005]; int main(){ int m,n,i,x,y; char c; while(scanf("%d%d",&m,&n)!=EOF){ for(i=1;i<=m;i++){ scanf("%d",&a[i]); update(1,1,m,i,a[i]); } for(i=1;i<=n;i++){ cin>>c; scanf("%d%d",&x,&y); if(c=='U') update(1,1,m,x,y); else if(c=='Q') printf("%d\n",question(1,1,m,x,y)); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47343211