#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std
;
const int N
= 2e5 + 10;
using ll
= long long;
int n
;
struct node
{
int l
, r
;
ll sum
, lz
;
}tree
[N
<< 2];
inline int ls(int cur
)
{
return cur
<< 1;
}
inline int rs(int cur
)
{
return (cur
<< 1) | 1;
}
void push_up(int cur
)
{
tree
[cur
].sum
= tree
[ls(cur
)].sum
+ tree
[rs(cur
)].sum
;
}
void push_down(int cur
)
{
if (tree
[cur
].lz
) {
tree
[ls(cur
)].sum
+= (tree
[ls(cur
)].r
- tree
[ls(cur
)].l
+ 1) * tree
[cur
].lz
;
tree
[ls(cur
)].sum
+= (tree
[rs(cur
)].r
- tree
[rs(cur
)].l
+ 1) * tree
[cur
].lz
;
tree
[ls(cur
)].lz
+= tree
[cur
].lz
;
tree
[rs(cur
)].lz
+= tree
[cur
].lz
;
tree
[cur
].lz
= 0;
}
}
void build(int cur
, int l
, int r
)
{
tree
[cur
].l
= l
;
tree
[cur
].r
= r
;
if (l
== r
) {
ll a
;
cin
>> a
;
tree
[cur
].sum
= a
;
return;
}
int mid
= (tree
[cur
].l
+ tree
[cur
].r
) >> 1;
build(ls(cur
), l
, mid
);
build(rs(cur
), mid
+ 1, r
);
push_up(cur
);
}
void update(int cur
, int l
, int r
, int v
)
{
if (tree
[cur
].l
== l
and tree
[cur
].r
== r
) {
tree
[cur
].sum
+= (r
- l
+ 1) * v
;
tree
[cur
].lz
+= v
;
return;
}
push_down(cur
);
int mid
= (tree
[cur
].l
+ tree
[cur
].r
) >> 1;
if (r
<= mid
) {
update(ls(cur
), l
, r
, v
);
}
else if (l
> mid
) {
update(rs(cur
), l
, r
, v
);
}
else {
update(ls(cur
), l
, mid
, v
);
update(rs(cur
), mid
+ 1, r
, v
);
}
push_up(cur
);
}
int query(int cur
, int l
, int r
)
{
if (tree
[cur
].l
== l
and tree
[cur
].r
== r
)
{
return tree
[cur
].sum
;
}
push_down(cur
);
int mid
= (tree
[cur
].l
+ tree
[cur
].r
) >> 1;
if (r
<= mid
) {
return query(ls(cur
), l
, r
);
}
else if (l
> mid
) {
return query(rs(cur
), l
, r
);
}
else {
return query(ls(cur
), l
, mid
) + query(rs(cur
), mid
+ 1, r
);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/VS CODE/C++/in.txt", "r", stdin);
freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif
cin
>> n
;
build(1, 1, n
);
return 0;
}
转载请注明原文地址: https://lol.8miu.com/read-19476.html