Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18019 Accepted Submission(s): 6947
Input 本题目包含多组测试,请处理到文件结束。
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 Hint Huge input,the C function scanf() will work better than cin 跟1166类似,稍微变化一下就好了
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maximum(x,y) ((x)>(y)?(x):(y)) #define maxn 200000 int ans; struct node {int left,right,max;int mid(){return (left+right)>>1;}}tree[maxn*4]; void btree(int left,int right,int rt) {tree[rt].left=left;tree[rt].right=right;if(left==right){scanf("%d",&tree[rt].max);return;}int mid=tree[rt].mid();btree(left,mid,rt<<1);btree(mid+1,right,rt<<1|1);tree[rt].max=maximum(tree[rt<<1].max,tree[rt<<1|1].max); } void update(int left,int right,int rt,int pos,int trans) {if(left==right){tree[rt].max=trans;return ;}int mid=tree[rt].mid();if(pos<=mid)update(left,mid,rt<<1,pos,trans);else update(mid+1,right,rt<<1|1,pos,trans);tree[rt].max=maximum(tree[rt<<1].max,tree[rt<<1|1].max); } void query(int left,int right,int rt,int L,int R) {if(L<=left&&right<=R){ans=maximum(ans,tree[rt].max);return;}int mid=tree[rt].mid();if(R<=mid)query(left,mid,rt<<1,L,R);else if(mid<L)query(mid+1,right,rt<<1|1,L,R);else{query(left,mid,rt<<1,L,R);query(mid+1,right,rt<<1|1,L,R);} } int main() {int n,t;int a,b;char str[10];while(scanf("%d%d",&n,&t)!=EOF){btree(1,n,1);while(t--){scanf("%s%d%d",str,&a,&b);if(str[0]=='Q'){ans=-1000;if(a>b)swap(a,b);query(1,n,1,a,b);printf("%dn",ans);}else if(str[0]=='U')update(1,n,1,a,b);}}return 0; }
转载于:.html
本文发布于:2024-02-01 02:46:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672676633318.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |