This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
#define endl '\n'
llo n,q;
llo it[200001];
llo dp[200001];
llo tree[200001*4][3][3];//(left negative,left empty,left positive)
llo lazy[200001*4];
void push(llo no,llo l,llo r){
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]+=(lazy[no]*(i-1+j-1));
}
}
if(l<r){
lazy[no*2+1]+=lazy[no];
lazy[no*2+2]+=lazy[no];
// lazy[no]=0;
}
lazy[no]=0;
}
//pair<llo,llo> tree[200001*4][3][3];
void build(llo no,llo l,llo r){
if(l==r){
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]=-1e17;
}
}
tree[no][1][1]=0;
for(llo i=0;i<3;i+=2){
tree[no][i][1]=(i-1)*it[l];
tree[no][1][i]=(i-1)*it[l];
}
}
else{
llo mid=(l+r)/2;
build(no*2+1,l,mid);
build(no*2+2,mid+1,r);
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]=max(tree[no*2+1][i][j],tree[no*2+2][i][j]);
}
}
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j+=2){
for(llo k=0;k<3;k+=2){
for(llo l=0;l<3;l++){
if(j!=k){
tree[no][i][l]=max(tree[no][i][l],tree[no*2+1][i][j]+tree[no*2+2][k][l]);
}
}
}
}
}
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]=max(tree[no*2+1][i][1]+tree[no*2+2][1][j],tree[no][i][j]);
}
}
}
/*
cout<<l<<":"<<r<<endl;
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
cout<<tree[no][i][j]<<",";
}
cout<<endl;
}
*/
}
void update(llo no,llo l,llo r,llo aa,llo bb,llo val){
push(no,l,r);
if(r<aa or l>bb){
return;
}
if(aa<=l and r<=bb){
lazy[no]+=val;
push(no,l,r);
}
else{
llo mid=(l+r)/2;
update(no*2+1,l,mid,aa,bb,val);
update(no*2+2,mid+1,r,aa,bb,val);
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]=max(tree[no*2+1][i][j],tree[no*2+2][i][j]);
}
}
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j+=2){
for(llo k=0;k<3;k+=2){
for(llo l=0;l<3;l++){
if(j!=k){
tree[no][i][l]=max(tree[no][i][l],tree[no*2+1][i][j]+tree[no*2+2][k][l]);
}
}
}
}
}
for(llo i=0;i<3;i++){
for(llo j=0;j<3;j++){
tree[no][i][j]=max(tree[no*2+1][i][1]+tree[no*2+2][1][j],tree[no][i][j]);
}
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>q;
for(llo i=0;i<n;i++){
cin>>it[i];
}
build(0,0,n-1);
//cout<<tree[0][1][1]<<endl;
for(llo ii=0;ii<q;ii++){
llo l,r,aa;
cin>>l>>r>>aa;
l--;
r--;
update(0,0,n-1,l,r,aa);
cout<<tree[0][1][1]<<endl;
/* for(llo j=l-1;j<=r-1;j++){
it[j]+=aa;
}
llo xx=-1e18;
llo yy=-1e18;
for(llo i=1;i<=n;i++){
llo ma=-1e18;
llo mi=1e18;
dp[i]=0;
xx=max(xx,dp[i-1]+it[i-1]);
yy=max(yy,dp[i-1]-it[i-1]);
dp[i]=max(dp[i],dp[i-1]);
dp[i]=max(dp[i],max(xx-it[i-1],yy+it[i-1]));
//cout<<dp[i]<<",";
}
//cout<<endl;
cout<<dp[n]<<endl;*/
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |