HDU1754 I Hate It 单点更新+区间求最值

来源:互联网 发布:java基础类型有哪些 编辑:程序博客网 时间:2024/06/13 02:20
//线段树模版#include<bits/stdc++.h>using namespace std;const int MAXNODE=1<<19;const int MAXN=2e6+10;struct NODE{int value;  //这里的value表示单点值,取左右儿子的最大值int left,right;}node[MAXNODE];int father[MAXN];void BuildTree(int i,int left,int right){node[i].left=left;node[i].right=right;node[i].value=0;if(left==right){father[left]=i;return;}BuildTree(i<<1,left,(int)(floor(left+right)/2.0));BuildTree((i<<1)+1,(int)(floor(left+right)/2.0)+1,right);}void UpdateTree(int ri){if(ri==1) return ;int fi=ri/2;int a=node[fi<<1].value;int b=node[(fi<<1)+1].value;node[fi].value=max(a,b);UpdateTree(ri/2);}int Max;  //Max可以写到Query函数里面让Query直接返回void Query(int i,int l,int r){if(node[i].left==l&&node[i].right==r){Max=max(Max,node[i].value);return ;}i=i<<1;if(l<=node[i].right){if(r<=node[i].right) Query(i,l,r);else Query(i,l,node[i].right);}i++;if(r>=node[i].left){if(l>=node[i].left) Query(i,l,r);else Query(i,node[i].left,r);}}int main(){int n,m,g;ios::sync_with_stdio(false);while(cin>>n>>m){BuildTree(1,1,n);for(int i=1;i<=n;i++){cin>>g;node[father[i]].value=g;UpdateTree(father[i]);}string op;int a,b;while(m--){cin>>op>>a>>b;if(op[0] == 'Q'){Max=0;Query(1,a,b);cout<<Max<<endl;}else{node[father[a]].value=b;UpdateTree(father[a]);}}}return 0;}

原创粉丝点击