HDU1754 I Hate It 單點更新+區間求最值
阿新 • • 發佈:2018-12-19
//線段樹模版 #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; }