题目:
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5 Sample Output5659HintHuge input,the C function scanf() will work better than cin代码:
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h> //tower()#include<set> #include<map> #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector> #include<time.h> #include<assert.h> //assert#include<cmath> #include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const int maxn=200010;const int inf=0x7fffffff;/*线段树单点更新*/#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int n,m,stree[maxn<<2];void build(int l,int r,int rt){//叶节点从l到r,树根为rt if(l==r){ scanf("%d",&stree[rt]);///stree[rt]=a[l]; return; } int mid=(l+r)>>1; build(lson);//自左向右读入a[]中数据 build(rson); stree[rt]=max(stree[rt<<1],stree[rt<<1|1]); }void update(int x,int v,int l,int r,int rt){//线段树(树根为rt,对应区间为[l,r])中x结点更新为v if(l==r){ stree[rt]=v; return; } int mid=(l+r)>>1; if(x<=mid) update(x,v,lson); if(x>mid) update(x,v,rson); stree[rt]=max(stree[rt<<1],stree[rt<<1|1]);}int query(int a,int b,int l,int r,int rt){//查询线段树(树根为rt,对应区间为[l,r])中子区间[a,b]的最大值 if(a<=l&&b>=r) return stree[rt]; int ans=-inf; int mid=(l+r)>>1; if(a<=mid) ans=max(query(a,b,lson),ans); if(b>mid) ans=max(query(a,b,rson),ans); return ans;}int main(){//1560MS 4696K while(scanf("%d%d",&n,&m)==2){ memset(stree,0,sizeof(stree)); build(1,n,1); char s[5]; int p,q; while(m--){ scanf("%s%d%d",s,&p,&q); if(s[0]=='U') update(p,q,1,n,1); else printf("%d/n",query(p,q,1,n,1)); } } return 0;}
新闻热点
疑难解答