HDU1754 I Hate It(線段樹單點更新)
阿新 • • 發佈:2019-02-09
Problem Description
很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。
這讓很多學生很反感。
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。 線段樹功能:update:單點替換 query:區間最值
這讓很多學生很反感。
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。 線段樹功能:update:單點替換 query:區間最值
//3172 KB 655 ms #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define M 200005 #define root 1,n,1 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int MAX[M<<2]; int n,m; void Pushup(int rt) { MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]); } void Build(int l,int r,int rt) { if(l==r){ scanf("%d",&MAX[rt]); return ; } int m=(l+r)>>1; Build(lson); Build(rson); Pushup(rt); } int query(int L,int R,int l,int r ,int rt) { if(L>r||R<l) return -1; if(L<=l&&r<=R){ return MAX[rt]; } int m=(l+r)>>1; int q1=-1,q2=-1; if(L<=m) q1=query(L,R,lson); if(R>m) q2=query(L,R,rson); return max(q1,q2); } void Update(int pos,int sc,int l,int r,int rt) { if(l==r){ MAX[rt]=sc; return ; } int m=(l+r)>>1; if(pos<=m){ Update(pos,sc,lson); } else Update(pos,sc,rson); Pushup(rt); } void print() { for(int i=1;i<=4*n;i++) printf("MAX[%d]=%d\n",i,MAX[i]); } int main() { int a,b; while(~scanf("%d%d",&n,&m)){ Build(root); while(m--){ char ch[10]; scanf("%s",ch); scanf("%d%d",&a,&b); if(ch[0]=='Q'){ printf("%d\n",query(a,b,root)); } else{ Update(a,b,root); } } } return 0; }