Tree line Problem Set

1, Los template Valley P3372 [1] segment tree

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ls(p) (p<<1)
 4 #define rs(p) (p<<1|1)
 5 #define ll long long
 6 const int MAXN=1e5+5;
 7 struct node
 8 {
 9     ll sum,lazy;
10     node(){sum=0,lazy=0;}
11 }T[MAXN*4];
12 int a[MAXN];
13 int n,m;
14 inline void push_up(int p)
15 {
16     T[p].sum=T[ls(p)].sum+T[rs(p)].sum;
17 }
18 inline void build(int p,int l,int r)
19 {
20     if(l==r) 
21     {
22         T[p].sum=a[l];
23         return;
24     }
25     int mid=(l+r)>>1;
26     build(ls(p),l,mid);
27     build(rs(p),mid+1,r);
28     push_up(p);
29 }
30 inline void push_down(int p,int l,int r)
31 {
32     if(!T[p].lazy) return;
33     int mid=(l+r)>>1;
34     T[ls(p)].lazy+=T[p].lazy,T[rs(p)].lazy+=T[p].lazy;
35     T[ls(p)].sum+=T[p].lazy*(mid-l+1),
36     T[rs(p)].sum+=T[p].lazy*(r-mid);
37     T[p].lazy=0;
38 }
39 inline void update(int p,int l,int r,int nl,int nr,int k) 
40 {
41     if(nl<=l&&nr>=r)
42     {
43         T[p].sum+=k*(r-l+1);
44         T[p].lazy+=k;
45         return;
46     }
47     push_down(p,l,r);
48     int mid=(l+r)>>1;
49     if(nl<=mid) update(ls(p),l,mid,nl,nr,k);
50     if(nr>=mid+1) update(rs(p),mid+1,r,nl,nr,k);
51     push_up(p);
52 }
53 ll query(int p,int l,int r,int nl,int nr)
54 {
55     ll ans=0;
56     if(nl<=l&&nr>=r) return T[p].sum;
57     push_down(p,l,r);
58     int mid=(l+r)>>1;
59     if(nl<=mid) ans+=query(ls(p),l,mid,nl,nr);
60     if(nr>=mid+1) ans+=query(rs(p),mid+1,r,nl,nr);
61     return ans;
62 }
63 int read()
64 {
65     int s=1,x=0;char ch=getchar();
66     while(!isdigit(ch)){if(ch=='-') s=-1;ch=getchar();}
67     while(isdigit(ch)) {x=10*x+ch-'0';ch=getchar();}
68     return s*x;
69 }
70 int main()
71 {
72     //freopen("testdata.in","r",stdin);
73     n=read();m=read();
74     for(int i=1;i<=n;++i) a[i]=read();
75     build(1,1,n);
76     int opt,x,y,k;
77     for(int i=1;i<=m;++i)
78     {
79         opt=read();
80         if(opt==1)//update
81         {
82             x=read(),y=read(),k=read();
83             update(1,1,n,x,y,k);
84         }
85         else //query
86         {
87             x=read(),y=read();
88             cout<<query(1,1,n,x,y)<<endl;
89         }
90     }
91     return 0;
92 }
View Code

 

Guess you like

Origin www.cnblogs.com/wangzhebufangqi/p/11278219.html