选最大值。线段树。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string.h> #include <queue> #include <cmath> #include <map> #include <vector> #define LL __int64 using namespace std; const int N=200010; const int root=1; struct Node{ int val,left,right; }tree[N*4+100]; int n,m; int score[N],pos[N]; void build(int rt,int l,int r){ if(l==r){ tree[rt].val=score[l]; tree[rt].left=l; tree[rt].right=r; pos[l]=rt; return; } tree[rt].left=l; tree[rt].right=r; build(rt*2,l,(r+l)/2); build(rt*2+1,(r+l)/2+1,r); tree[rt].val=max(tree[rt*2].val,tree[rt*2+1].val); } int query(int now,int l,int r){ int L=tree[now].left ,R=tree[now].right; if(l<=L&&r>=R){ return tree[now].val; } int m=(L+R)/2; if(l>=m+1){ return query(now*2+1,l,r); } else if(r<=m) return query(now*2,l,r); else{ return max(query(now*2,l,r),query(now*2+1,l,r)); } } void update(int now,int s){ tree[now].val=s; now/=2; while(now>0){ tree[now].val=max(tree[now*2].val,tree[now*2+1].val); now/=2; } } int main(){ int p,q; char act; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++) scanf("%d",&score[i]); getchar(); build(root,1,n); for(int i=1;i<=m;i++){ scanf("%c%d%d",&act,&p,&q); getchar(); // cout<<act<<p<<q<<endl; if(act==‘Q‘){ printf("%d\n",query(root,p,q)); } else{ p=pos[p]; update(p,q); } } } return 0; }
原文:http://www.cnblogs.com/jie-dcai/p/4314474.html