标签:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int MAXN = 200005; int mark[MAXN << 2]; int max(int a, int b) { return a > b ? a : b; } void Max(int rt) { mark[rt] = max( mark[rt << 1], mark[(rt << 1) + 1] ); //开始用 rt << 1 | 1 超时了 } void build(int l, int r, int rt) { if(l == r) { scanf("%d", &mark[rt]); return; } int mid = (l + r) >> 1; build( l, mid, rt << 1); build( mid + 1, r, (rt << 1) + 1); Max(rt); } void update( int n, int score, int l, int r, int rt) { if(l == r ) { mark[rt] = score; return; } int mid = ( l + r) >> 1; if(n <= mid) update( n, score, l, mid, rt << 1); if(n > mid) update( n, score, mid + 1, r, (rt << 1) + 1); Max(rt); } int query(int ll, int rr , int l ,int r, int rt) { if(ll <= l && rr >= r) { return mark[rt]; } int mid = ( l + r ) >> 1; int m = 0; if( ll <= mid) m = max( m, query(ll, rr, l, mid, rt << 1)); if( rr > mid) m = max( m, query(ll, rr, mid + 1, r, (rt << 1) + 1)); return m; } int main() { int N,M,A,B; char ch; while(~scanf("%d %d",&N,&M)) { build(1, N, 1); for(int i = 0; i< M; i++) { scanf("%*c%c%d %d",&ch,&A,&B); if(ch == ‘U‘) update(A,B,1,N,1); else printf("%d\n",query(A,B,1,N,1)); } } }
标签:
原文地址:http://www.cnblogs.com/yong-hua/p/4655937.html