1.单点更新,求区间最大值
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <cmath> #include <iomanip> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <cctype> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int maxn=200010; #define lson i<<1 #define rson (i<<1)|1 struct ST { int l,r; int maxx; }st[maxn<<2]; void pushup(int i) { st[i].maxx=max(st[lson].maxx,st[rson].maxx); } void build(int i,int l,int r) { st[i].l=l; st[i].r=r; if(st[i].l==st[i].r) { rd(st[i].maxx); return; } int mid=(st[i].l+st[i].r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushup(i); } void update(int i,int p,int val) { if(st[i].l==st[i].r) { st[i].maxx=val; return; } int mid=(st[i].l+st[i].r)>>1; if(p<=mid) update(lson,p,val); else update(rson,p,val); pushup(i); } int query(int i,int l,int r) { if(st[i].l==l&&st[i].r==r) { return st[i].maxx; } int mid=(st[i].l+st[i].r)>>1; if(l>mid) return query(rson,l,r); else if(r<=mid) return query(lson,l,r); else return max(query(lson,l,mid),query(rson,mid+1,r)); } int n,m; char cm[2]; int l,r,p,val; int main() { while(rd2(n,m)!=EOF) { build(1,1,n); while(m--) { scanf("%s",cm); if(cm[0]=='U') { rd2(p,val); update(1,p,val); } else { rd2(l,r); printf("%d\n",query(1,l,r)); } } } return 0; }
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <cmath> #include <iomanip> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <cctype> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int maxn=100010; #define lson i<<1 #define rson (i<<1)|1 struct ST { int l,r; ll sum; ll lazy; }st[maxn<<2]; void pushup(int i) { st[i].sum=st[lson].sum+st[rson].sum; } void pushdown(int i,int len) { if(st[i].lazy) { st[lson].lazy+=st[i].lazy; st[rson].lazy+=st[i].lazy; st[lson].sum+=(ll)(len-(len>>1))*st[i].lazy; st[rson].sum+=(ll)(len>>1)*st[i].lazy; st[i].lazy=0; } } void build(int i,int l,int r) { st[i].l=l; st[i].r=r; st[i].lazy=0; if(st[i].l==st[i].r) { scanf("%I64d",&st[i].sum); return; } int mid=(st[i].l+st[i].r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushup(i); } void update(int i,int l,int r,ll val) { if(st[i].l==l&&st[i].r==r) { st[i].sum+=(ll)(r-l+1)*val; st[i].lazy+=val; return ; } int mid=(st[i].l+st[i].r)>>1; pushdown(i,st[i].r-st[i].l+1); if(r<=mid) update(lson,l,r,val); else if(l>mid) update(rson,l,r,val); else { update(lson,l,mid,val); update(rson,mid+1,r,val); } pushup(i); } ll query(int i,int l,int r) { if(st[i].l==l&&st[i].r==r) { return st[i].sum; } pushdown(i,st[i].r-st[i].l+1); int mid=(st[i].l+st[i].r)>>1; if(r<=mid) return query(lson,l,r); else if(l>mid) return query(rson,l,r); else return query(i<<1,l,mid)+query(rson,mid+1,r); } int n,q; char cm[2]; int l,r,p; ll val; int main() { while(rd2(n,q)!=EOF) { build(1,1,n); while(q--) { scanf("%s",cm); if(cm[0]=='Q') { rd2(l,r); printf("%I64d\n",query(1,l,r)); } else { rd2(l,r); scanf("%I64d\n",&val); update(1,l,r,val); } } } return 0; }