hdu 1754
分块
把n个点分成sqrt(n)个块;
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<set> #include<string> using namespace std; typedef long long LL; #define inf 2000000000 #define MAXN 200010 int sc[MAXN]; int mx_sc[MAXN]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int sz=(int)sqrt(n*1.0); memset(mx_sc,0,sizeof(mx_sc)); for(int i=1;i<=n;i++) { scanf("%d",&sc[i]); int x=i/sz; mx_sc[x]=max(mx_sc[x],sc[i]); //每个块求最大的 } while(m--) { int l,r; char s[5]; scanf("%s%d%d",s,&l,&r); if(s[0]=='Q') { int ans=0; for(int i=l;i<=r;) { int x=i/sz; if(i%sz==0&&i+sz-1<=r) { ans=max(ans,mx_sc[x]); i+=sz; } else { ans=max(ans,sc[i]); i++; } } printf("%d\n",ans); } else { int x=l/sz; mx_sc[x]=r; sc[l]=r; for(int i=x*sz;i<(x+1)*sz&&i<=n;i++) //更新一下 mx_sc[x]=max(mx_sc[x],sc[i]); } } } return 0; }
posted on 2017-02-22 20:24 HelloWorld!--By-MJY 阅读(203) 评论(0) 编辑 收藏 举报