这是一道线段树的裸题……带单点修改的RMQ
为什么我会想到写这么一道傻逼题呢?是因为这样……
我很好奇那个突然冒出来的黄色箭头是什么……所以就去切了一下这道水题……
毫无压力地快速敲完……突然萌生了一种想法:试试自底向上线段树!
重新看了下zkw大牛的《统计的力量》,发现确实好写,而且灰常好用!
写的时候出现的问题:读入应该是读到[n+1,n+n]这一段,而我读到了[n+i-1,n+n-1]……(也就是说:1~n格是树中节点,后n个格是叶子节点)
1 int t[N<<2],a[N]; 2 #define L (o<<1) 3 #define R (o<<1|1) 4 #define mid (l+r>>1) 5 void maintain(int o,int l,int r){ 6 if (l<r) t[o]=max(t[L],t[R]); 7 } 8 void build(int o,int l,int r){ 9 if (l==r) t[o]=a[l]; 10 else{ 11 build(L,l,mid); 12 build(R,mid+1,r); 13 maintain(o,l,r); 14 } 15 } 16 void update(int o,int l,int r,int pos,int v){ 17 if (l==r) t[o]=v; 18 else{ 19 if (pos<=mid) update(L,l,mid,pos,v); 20 else update(R,mid+1,r,pos,v); 21 maintain(o,l,r); 22 } 23 } 24 int ql,qr,ans; 25 void query(int o,int l,int r){ 26 if (ql<=l && qr>=r) ans=max(ans,t[o]); 27 else{ 28 if (ql<=mid) query(L,l,mid); 29 if (qr>mid) query(R,mid+1,r); 30 } 31 }