分类: Java
2016-12-23 17:00:44
n个数,m次操作
若a==1,求区间b-c最大值
若a==2,将a[ b ]改为c
#include#include #include #include #include #define MAXN 200000 using namespace std; int a[MAXN+5],st[MAXN*4+5]; void bulid(int o,int l,int r) { if(l==r) st[o]=a[l]; else { int m=l+((r-l)>>1); bulid((o<<1),l,m); bulid((o<<1)|1,m+1,r); st[o]=max(st[o<<1],st[(o<<1)|1]); } } void exch(int o,int l,int r,int ind,int ans) { if(l==r) { st[o]=ans; return; } else { int m=l+((r-l)>>1); if(ind<=m) { exch((o<<1),l,m,ind,ans);//|1相当于+1 } else { exch((o<<1)|1,m+1,r,ind,ans); } } st[o]=max(st[o<<1],st[(o<<1)|1]); } int sear(int o,int l,int r,int ql,int qr) { if(qr r)return 0; if(qr>=r&&ql<=l)return st[o]; int m=l+((r-l)>>1); return max(sear((o<<1),l,m,ql,qr),sear((o<<1)|1,m+1,r,ql,qr)); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); bulid(1,1,n); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a==1) printf("%d\n",sear(1,1,n,b,c)); else exch(1,1,n,b,c); } return 0; }来源: