[模板]正常线段树

  RT

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 #define int long long
 6 #define maxn 400050
 7 int n,m,ans=0;
 8 int a[100050];
 9 struct node
10 {
11     int l;
12     int r;
13     int w;
14     int f;
15 }tree[maxn];
16
17 void build(int k,int l,int r)
18 {
19     tree[k].l=l;
20     tree[k].r=r;
21     if(l==r)
22     {
23         tree[k].w=a[l];
24         return ;
25     }
26     int mid=(l+r)>>1;
27     build(k<<1,l,mid);
28     build(k<<1|1,mid+1,r);
29     tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
30 }
31 void down(int k)
32 {
33     if(tree[k].w)
34     {
35         tree[k<<1].w+=tree[k].f*(tree[k<<1].r-tree[k<<1].l+1);
36         tree[k<<1|1].w+=tree[k].f*(tree[k<<1|1].r-tree[k<<1|1].l+1);
37         tree[k<<1].f+=tree[k].f;
38         tree[k<<1|1].f+=tree[k].f;
39         tree[k].f=0;
40     }
41 }
42 void area_change(int l,int r,int w,int k)
43 {
44     if(tree[k].l>=l&&r>=tree[k].r)
45     {
46         tree[k].w+=w*(tree[k].r-tree[k].l+1);
47         tree[k].f+=w;
48         return;
49     }
50     down(k);
51     int mid=(tree[k].r+tree[k].l)>>1;
52     if(l<=mid)
53     area_change(l,r,w,k<<1);
54     if(r>mid)
55     area_change(l,r,w,k<<1|1);
56     tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
57 }
58 int area_ask(int k,int l,int r)
59 {
60     if(l<=tree[k].l&&r>=tree[k].r) return tree[k].w;
61     down(k);
62     int mid=(tree[k].l+tree[k].r)>>1;
63     int ans=0;
64     if(l<=mid)ans+=area_ask(k<<1,l,r);
65     if(r>mid)ans+=area_ask(k<<1|1,l,r);
66     return ans;
67 }
68 signed main()
69 {
70     scanf("%lld %lld",&n,&m);
71     for(int i=1;i<=n;i++)
72     {
73         scanf("%lld",&a[i]);
74     }
75
76     build(1,1,n);
77     for(int i=1;i<=m;i++)
78     {
79         int cz;
80         scanf("%lld",&cz);
81         if(cz==1)
82         {
83             int x,y,z;
84             scanf("%lld%lld%lld",&x,&y,&z);
85             area_change(x,y,z,1);
86         }
87         else
88         {
89             int x,y;
90             scanf("%lld%lld",&x,&y);
91             cout<<area_ask(1,x,y)<<endl;;
92         }
93     }
94     return 0;
95 }

-----2021届张若琛

12-31 21:00