pku 3468
2012-08-19 08:44
162 查看
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <map> #include <set> #include <string> #include <cstring> #include <list> #include <queue> #include <stack> #include <cmath> using namespace std; #define PF(x) (scanf("%d",&x)) #define PT(x,y) (scanf("%d%d",&x,&y)) #define PR(x) (printf("%d\n",x)) #define PRT(x,y)(printf("%d %d\n",x,y)) #define PB(x)(scanf("%I64d",&x)) #define PRB(x)(printf("%I64d\n",(x))) typedef __int64 LL; #define N 100005 #define M 105 #define Mod 1000 #define Inf 0x7fffffff #define L(x) (x<<1) #define R(x) ((x<<1)|1) #define For(i,n) for(int i=0;i<n;i++) #define lowbit(x) (x) & (-x) #define mid(x,y) ((x+y)>>1) struct tree { int l,r; LL sum; LL add; }; tree T[4*N]; int n; LL ar ; inline int maxx(int a,int b) { return a>b?a:b; } inline int minx(int a,int b) { return a>b?b:a; } void build(int l,int r,int k) { T[k].l = l; T[k].r = r; T[k].add = 0; if(l == r) {T[k].sum = ar[l-1];return ;} int mi = mid(l,r); build(l,mi,L(k)); build(mi+1,r,R(k)); T[k].sum = T[L(k)].sum+T[R(k)].sum; } void update(int l,int r,LL var,int k) { if(l <= T[k].l && r>= T[k].r) { T[k].add += var; T[k].sum += var *(T[k].r-T[k].l+1); return ; } if(T[k].add != 0 ) { T[L(k)].add += T[k].add; T[R(k)].add += T[k].add; T[L(k)].sum += T[k].add *(T[L(k)].r-T[L(k)].l+1); T[R(k)].sum += T[k].add *(T[R(k)].r-T[R(k)].l+1); T[k].add = 0; } int mi = mid(T[k].l,T[k].r); if(l<=mi) update(l,r,var,L(k)); if(r>mi) update(l,r,var,R(k)); T[k].sum = T[L(k)].sum+T[R(k)].sum; } LL sum(int l,int r,int k) { if(l<= T[k].l && r>=T[k].r) return T[k].sum; if(T[k].add !=0) { T[L(k)].add += T[k].add; T[R(k)].add += T[k].add; T[L(k)].sum += T[k].add *(T[L(k)].r-T[L(k)].l+1); T[R(k)].sum += T[k].add *(T[R(k)].r-T[R(k)].l+1); T[k].add = 0; } int mi = mid(T[k].l,T[k].r); LL ans = 0; if(l<=mi) ans+= sum(l,r,L(k)); if(r>mi) ans += sum(l,r,R(k)); return ans; } void init() { int q; while(scanf("%d%d",&n,&q)!=EOF) { For(i,n) PB(ar[i]); char s[10]; build(1,n,1); For(i,q) { int x,y; LL z; scanf("%s",s); if(s[0]=='Q') { PT(x,y); PRB(sum(x,y,1)); } else { PT(x,y);PB(z); update(x,y,z,1); } } } return ; } int main() { init(); return 0; }
相关文章推荐
- BZOJ3212: Pku3468 A Simple Problem with Integers
- [BZOJ3212]Pku3468 A Simple Problem with Integers
- bzoj3212 pku3468 A Simple Problem with Integers
- BZOJ 3212【Pku 3468】A Simple Problem with Integers==线段树裸题
- bzoj3212 Pku3468 A Simple Problem with Integers
- bzoj3212 Pku3468 A Simple Problem with Integers 线段树
- http://acm.pku.edu.cn/JudgeOnline/problem?id=3468 成段更新,区间求和(要用long long)
- PKU 3468 A Simple Problem with Integers
- 3212: Pku3468 A Simple Problem with Integers
- pku3468(线段树)
- PKU 3468 A Simple Problem with Integers
- PKU 3468 A Simple Problem with Integers
- 【分块】【线段树】bzoj3212 Pku3468 A Simple Problem with Integers
- bzoj 3212: Pku3468 A Simple Problem with Integers (线段树)
- 3212: Pku3468 A Simple Problem with Integers
- 线段树 区域覆盖模版题 pku 3468 A Simple Problem with Integers 线段树——成段操作
- BZOJ 3212 Pku3468 A Simple Problem with Integers
- [BZOJ3212] Pku3468 A Simple Problem with Integers
- 线段树系列-pku-3468-A Simple Problem with Integers-区间修改区间求和
- pku -- 3468 A Simple Problem with Integers(线段树)