洛谷P3372
1 //线段树 询问区间和,支持区间修改
2 #include <cstdio>
3
4 using namespace std;
5
6 struct treetype
7 {
8 int l,r;
9 long long sum,d;
10 };
11
12 const int maxn=1000010;
13
14 treetype a[maxn<<2];
15 long long num[maxn];
16
17 void build(int k,int l,int r)
18 {
19 a[k].l=l;a[k].r=r;a[k].d=0;
20 if (a[k].l==a[k].r)
21 {
22 a[k].sum=num[l];
23 return;
24 }
25 int mid=(l+r)>>1,i=k<<1;
26 build(i,l,mid);
27 build(i+1,mid+1,r);
28 a[k].sum=a[i].sum+a[i+1].sum;
29 }
30 void pushdown(int k)
31 {
32 if (a[k].l==a[k].r) a[k].d=0;
33 if (a[k].d==0) return;
34 //int i=k<<1;long long t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
35 //i++;t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
36 int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
37 i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
38 a[k].d=0;
39 }
40 void change(int k,int l,int r,long long d)
41 {
42 pushdown(k);
43 if (l<=a[k].l && a[k].r<=r)
44 {
45 //long long t=a[k].r-a[k].l+1;
46 a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
47 return;
48 }
49 int mid=(a[k].l+a[k].r)>>1,i=k<<1;
50 if (l<=mid) change(i,l,r,d);
51 if (mid<r) change(i+1,l,r,d);
52 a[k].sum=a[i].sum+a[i+1].sum;
53 }
54 long long query(int k,int l,int r)
55 {
56 pushdown(k);
57 if (l<=a[k].l && a[k].r<=r) return a[k].sum;
58 int mid=(a[k].l+a[k].r)>>1,i=k<<1;
59 long long ans=0;
60 if (l<=mid) ans=query(i,l,r);
61 if (mid<r) ans+=query(i+1,l,r);
62 return ans;
63 }
64
65 int main()
66 {
67 int n,m;
68 scanf("%d%d",&n,&m);
69 for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
70 build(1,1,n);
71 for (int i=1;i<=m;i++)
72 {
73 int p,x,y;
74 scanf("%d%d%d",&p,&x,&y);
75 if (p==1)
76 {
77 long long k;
78 scanf("%lld",&k);
79 change(1,x,y,k);
80 }
81 else printf("%lld
",query(1,x,y));
82 }
83 return 0;
84 }
poj3468
1 //线段树 询问区间和,支持区间修改
2 #include <cstdio>
3
4 using namespace std;
5
6 struct treetype
7 {
8 int l,r;
9 long long sum,d;
10 };
11
12 const int maxn=100010;
13
14 treetype a[maxn<<2];
15 long long num[maxn];
16
17 void build(int k,int l,int r)
18 {
19 a[k].l=l;a[k].r=r;a[k].d=0;
20 if (a[k].l==a[k].r)
21 {
22 a[k].sum=num[l];
23 return;
24 }
25 int mid=(l+r)>>1,i=k<<1;
26 build(i,l,mid);
27 build(i+1,mid+1,r);
28 a[k].sum=a[i].sum+a[i+1].sum;
29 }
30 void pushdown(int k)
31 {
32 if (a[k].l==a[k].r) a[k].d=0;
33 if (a[k].d==0) return;
34 int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
35 i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
36 a[k].d=0;
37 }
38 void change(int k,int l,int r,long long d)
39 {
40 pushdown(k);
41 if (l<=a[k].l && a[k].r<=r)
42 {
43 a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
44 return;
45 }
46 int mid=(a[k].l+a[k].r)>>1,i=k<<1;
47 if (l<=mid) change(i,l,r,d);
48 if (mid<r) change(i+1,l,r,d);
49 a[k].sum=a[i].sum+a[i+1].sum;
50 }
51 long long query(int k,int l,int r)
52 {
53 pushdown(k);
54 if (l<=a[k].l && a[k].r<=r) return a[k].sum;
55 int mid=(a[k].l+a[k].r)>>1,i=k<<1;
56 long long ans=0;
57 if (l<=mid) ans=query(i,l,r);
58 if (mid<r) ans+=query(i+1,l,r);
59 return ans;
60 }
61
62 int main()
63 {
64 int n,m;
65 scanf("%d%d",&n,&m);
66 for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
67 build(1,1,n);
68 for (int i=1;i<=m;i++)
69 {
70 char p;scanf("%c",&p);
71 int x,y;
72 scanf("%c%d%d",&p,&x,&y);
73 if (p=='C')
74 {
75 long long k;
76 scanf("%lld",&k);
77 change(1,x,y,k);
78 }
79 else printf("%lld
",query(1,x,y));
80 }
81 return 0;
82 }