update
This commit is contained in:
parent
5b8eff62bc
commit
f584924baf
3
day14/P3372/1.ans
Normal file
3
day14/P3372/1.ans
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
11
|
||||||
|
8
|
||||||
|
20
|
7
day14/P3372/1.in
Normal file
7
day14/P3372/1.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
5 5
|
||||||
|
1 5 4 2 3
|
||||||
|
2 2 4
|
||||||
|
1 2 3 2
|
||||||
|
2 3 4
|
||||||
|
1 1 5 1
|
||||||
|
2 1 4
|
122
day14/P3372/P3372.cpp
Normal file
122
day14/P3372/P3372.cpp
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
#include <cctype>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
template<size_t MAX>
|
||||||
|
class SegTree{
|
||||||
|
public:
|
||||||
|
SegTree(int arr[],int n);
|
||||||
|
void add(int l,int r,int c);
|
||||||
|
int search(int l,int r);
|
||||||
|
private:
|
||||||
|
int n;
|
||||||
|
int t[MAX*4+1];
|
||||||
|
int l[MAX*4+1];
|
||||||
|
private:
|
||||||
|
void build(int s,int e,int now,int arr[]);
|
||||||
|
void update(int s,int e,int now,int l,int r,int c);
|
||||||
|
int getSum(int s,int e,int now,int l,int r);
|
||||||
|
};
|
||||||
|
int readInt();
|
||||||
|
|
||||||
|
const int MAX_N=1e5+5;
|
||||||
|
int arr[MAX_N];
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
const int n=readInt(),m=readInt();
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
arr[i]=readInt();
|
||||||
|
}
|
||||||
|
SegTree<MAX_N> s(arr,n);
|
||||||
|
for(int i=1;i<=m;i++){
|
||||||
|
const int z=readInt(),x=readInt(),y=readInt();
|
||||||
|
if(z==1){
|
||||||
|
const int k=readInt();
|
||||||
|
s.add(x, y, k);
|
||||||
|
}else{
|
||||||
|
cout<<s.search(x, y)<<endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int readInt(){
|
||||||
|
int x=0,w=1;
|
||||||
|
char ch=0;
|
||||||
|
while(!isdigit(ch)){
|
||||||
|
if(ch=='-')w=-1;
|
||||||
|
ch=getchar();
|
||||||
|
}
|
||||||
|
while(isdigit(ch)){
|
||||||
|
x=x*10+(ch-'0');
|
||||||
|
ch=getchar();
|
||||||
|
}
|
||||||
|
return x*w;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
int SegTree<n>::getSum(int s,int e,int now,int l,int r){
|
||||||
|
if(l<=s&&e<=r){
|
||||||
|
return t[now];
|
||||||
|
}
|
||||||
|
int m=(e-s)/2+s;
|
||||||
|
if(this->l[now]){
|
||||||
|
t[now*2]+=this->l[now]*(m-s+1);
|
||||||
|
t[now*2+1]+=this->l[now]*(e-(m+1)+1);
|
||||||
|
this->l[now*2]+=this->l[now];
|
||||||
|
this->l[now*2+1]+=this->l[now];
|
||||||
|
this->l[now]=0;
|
||||||
|
}
|
||||||
|
int sum=0;
|
||||||
|
if(l<=m)sum=getSum(s, m, now, l, r);
|
||||||
|
if(m+1<=r)sum+=getSum(m+1, e, now, l, r);
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
int SegTree<n>::search(int l,int r){
|
||||||
|
return getSum(1, n, 1, l, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
void SegTree<n>::update(int s,int e,int now,int l,int r,int c){
|
||||||
|
if(l<=s&&e<=r){
|
||||||
|
t[now]+=(e-s+1)*c;
|
||||||
|
this->l[now]+=c;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int m=(e-s)/2+s;
|
||||||
|
if(this->l[now]&&s!=e){
|
||||||
|
t[now*2]+=this->l[now]*(m-s+1);
|
||||||
|
t[now*2+1]+=this->l[now]*(e-(m+1)+1);
|
||||||
|
this->l[now*2]+=this->l[now];
|
||||||
|
this->l[now*2+1]+=this->l[now];
|
||||||
|
this->l[now]=0;
|
||||||
|
}
|
||||||
|
if(l<=m)update(s, m, now, l, r, c);
|
||||||
|
if(m+1<=r)update(m+1, e, now, l, r, c);
|
||||||
|
t[now]=t[now*2]+t[now*2+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
void SegTree<n>::add(int l,int r,int c){
|
||||||
|
update(1, n, 1, l, r, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
void SegTree<n>::build(int s,int e,int now,int arr[]){
|
||||||
|
if(s==e){
|
||||||
|
t[now]=arr[s];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int m=s+(e-s)/2;
|
||||||
|
build(s, m, now*2, arr);
|
||||||
|
build(m+1, e, now*2+1, arr);
|
||||||
|
t[now]=t[now*2]+t[now*2+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
template<size_t n>
|
||||||
|
SegTree<n>::SegTree(int arr[],int n):n(n){
|
||||||
|
build(1, n, 1, arr);
|
||||||
|
}
|
7
day14/P3372/P3372.json
Normal file
7
day14/P3372/P3372.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files":["P3372.cpp"],
|
||||||
|
"args":["-Wall","-g"],
|
||||||
|
"tests":[
|
||||||
|
{"in":"1.in","ans":"1.ans"}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user