HDU 1754 single-point update, maximum interval query, water question ......
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>#include<set>#include<cmath>#include<bitset>#define mem(a,b) memset(a,b,sizeof(a))#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define INF 1000000#define maxn 1000010using namespace std;typedef long long ll;typedef unsigned long long ull;int Max[maxn],a[200005],n,m,i;void pushup(int i){ Max[i]=max(Max[i<<1],Max[i<<1|1]);}void build(int i,int l,int r){ if(l==r) { Max[i]=a[l]; return ; } int mid=(l+r)>>1; build(lson);build(rson); pushup(i);}void update(int i,int l,int r,int x,int v){ if(l==r&&l==x) { Max[i]=v; return ; } int mid=(l+r)>>1; if(x<=mid) update(lson,x,v); else update(rson,x,v); pushup(i);}int query(int i,int l,int r,int L,int R){ if(L<=l&&r<=R) return Max[i]; int mid=(l+r)>>1,ans=0; if(L<=mid) ans=max(ans,query(lson,L,R)); if(R>mid) ans=max(ans,query(rson,L,R)); return ans;}int main(){ while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d",a+i); build(1,1,n); int x,y; char str[3]; while(m--) { scanf("%s%d%d",str,&x,&y); if(str[0]=='Q') printf("%d\n",query(1,1,n,x,y)); else update(1,1,n,x,y); } } return 0;}
HDU 1698 Interval Update, interval query, lazy tag type, water ......
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>#include<set>#include<cmath>#include<bitset>#define mem(a,b) memset(a,b,sizeof(a))#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define INF 1000000#define maxn 400010using namespace std;typedef long long ll;typedef unsigned long long ull;int sum[maxn],lazy[maxn],n,q;void pushup(int i){ sum[i]=sum[i<<1]+sum[i<<1|1];}void pushdown(int i,int l,int r){ if(lazy[i]) { int mid=(l+r)>>1; lazy[i<<1]=lazy[i<<1|1]=lazy[i]; sum[i<<1]=(mid-l+1)*lazy[i<<1]; sum[i<<1|1]=(r-mid)*lazy[i<<1|1]; lazy[i]=0; }}void update(int i,int l,int r,int L,int R,int v){ if(l==L&&r==R) { sum[i]=(r-l+1)*v; lazy[i]=v; return ; } int mid=(l+r)>>1; pushdown(i,l,r); if(R<=mid) update(lson,L,R,v); else if(L>mid) update(rson,L,R,v); else { update(lson,L,mid,v); update(rson,mid+1,R,v); } pushup(i);}void build(int i,int l,int r){ if(l==r) { sum[i]=1; lazy[i]=1; return ; } sum[i]=lazy[i]=0; int mid=(l+r)>>1; build(lson);build(rson); pushup(i);}int main(){ int t; cin>>t; for(int i=1;i<=t;i++) { scanf("%d%d",&n,&q); build(1,1,n); int l,r,v; while(q--) { scanf("%d%d%d",&l,&r,&v); update(1,1,n,l,r,v); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } return 0;}