#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <unordered_map>
#include <stack>
#include <bit>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
#define ll long long
#define ld long double
#define inf (ll)(2*1e18)
#define sort(a) sort(a.begin(), a.end())
#define reverse(a) reverse(a.begin(), a.end())
#define pb push_back
#define endl "\n"
using namespace std;
struct Node{
ll pref=0, suf=0, prefVal=0, sufVal=0, res=0, push1=0, push2=-1, sum=0;
bool isConnected=true;
};
Node con(const Node& a, const Node& b){
Node res;
res.isConnected = false;
if(a.isConnected and b.isConnected){
if(a.sufVal == b.prefVal){
res.isConnected = true;
res.res = res.pref = res.suf = a.suf + b.pref;
}
}else if(a.isConnected){
if(a.sufVal == b.prefVal){
res.res = res.pref = a.suf + b.pref;
}
}else if(b.isConnected){
if(a.sufVal == b.prefVal){
res.res = res.suf = a.suf + b.pref;
}
}
if(a.sufVal == b.prefVal){
res.res = max(res.res, a.suf + b.pref);
}
res.res = max({res.res, a.res, b.res});
res.prefVal = a.prefVal;
res.sufVal = b.sufVal;
res.pref = max(res.pref, a.pref);
res.suf = max(res.suf, b.suf);
res.sum = a.sum + b.sum;
return res;
}
void build(ll id, ll l, ll r, vector<ll>& d, vector<Node>& a){
if(l == r){
if(l != 0){
a[id].sum = a[id].prefVal = a[id].sufVal = d[l] - d[l-1];
a[id].res = a[id].pref = a[id].suf = 1;
}
return;
}
ll m = (l+r)/2;
build(2*id, l, m, d, a);
build(2*id + 1, m+1, r, d, a);
a[id] = con(a[2*id], a[2*id+1]);
}
void push(ll id, ll l, ll r, vector<Node>& a){
ll m=(l+r)/2;
if(a[id].push2 == -1){
a[2*id].sufVal += a[id].push1;
a[2*id].prefVal += a[id].push1;
a[2*id].push1 += a[id].push1;
a[2*id].sum += (m - l + 1)*a[id].push1;
a[2*id + 1].sufVal += a[id].push1;
a[2*id + 1].prefVal += a[id].push1;
a[2*id + 1].push1 += a[id].push1;
a[2*id + 1].sum += (r - m)*a[id].push1;
a[id].push1 = 0;
}else{
a[id].push2 += a[id].push1;
a[2*id].push1 = 0;
a[2*id].push2 = a[id].push2;
a[2*id].res = a[2*id].suf = a[2*id].pref = m - l + 1;
a[2*id].prefVal = a[2*id].sufVal = a[id].push2;
a[2*id].isConnected = true;
a[2*id].sum = (m - l + 1)*a[id].push2;
a[2*id+1].push1 = 0;
a[2*id+1].push2 = a[id].push2;
a[2*id+1].res = a[2*id+1].suf = a[2*id+1].pref = m - l + 1;
a[2*id+1].prefVal = a[2*id+1].sufVal = a[id].push2;
a[2*id+1].isConnected = true;
a[2*id+1].sum = (r - m)*a[id].push2;
a[id].push1 = 0;
a[id].push2 = -1;
}
}
Node get(ll id, ll l, ll r, ll tl, ll tr, vector<Node>& a){
if(r < tl or tr < l) return Node();
if(tl <= l and r <= tr){
return a[id];
}
push(id, l, r, a);
ll m=(l+r)/2;
return con(get(2*id, l, m, tl, tr, a), get(2*id+1, m+1, r, tl, tr, a));
}
void add(ll id, ll l, ll r, ll tl, ll tr, ll val, vector<Node>& a){
if(r < tl or tr < l) return;
if(tl <= l and r <= tr){
a[id].prefVal += val;
a[id].sufVal += val;
a[id].push1 += val;
a[id].sum += (r - l + 1)*val;
return;
}
push(id, l, r, a);
ll m=(l+r)/2;
add(2*id, l, m, tl, tr, val, a);
add(2*id+1, m+1, r, tl, tr, val, a);
a[id] = con(a[2*id], a[2*id+1]);
}
void add(ll id, ll l, ll r, ll x, ll val, vector<Node>& a){
if(l == r){
a[id].prefVal += val;
a[id].sufVal += val;
a[id].push1 += val;
a[id].sum += val;
return;
}
push(id, l, r, a);
ll m=(l+r)/2;
if(x <= m){
add(2*id, l, m, x, val, a);
}else{
add(2*id+1, m+1, r, x, val, a);
}
a[id] = con(a[2*id], a[2*id+1]);
}
void Set(ll id, ll l, ll r, ll tl, ll tr, ll val, vector<Node>& a){
if(r < tl or tr < l) return;
if(tl <= l and r <= tr){
a[id].push1 = 0;
a[id].push2 = val;
a[id].prefVal = a[id].sufVal = val;
a[id].res = a[id].pref = a[id].suf = r - l + 1;
a[id].isConnected = true;
a[id].sum = (r - l + 1)*val;
return;
}
push(id, l, r, a);
ll m=(l+r)/2;
Set(2*id, l, m, tl, tr, val, a);
Set(2*id+1, m+1, r, tl, tr, val, a);
a[id] = con(a[2*id], a[2*id+1]);
}
void Set(ll id, ll l, ll r, ll x, ll val, vector<Node>& a){
if(l == r){
a[id].push1 = 0;
a[id].push2 = val;
a[id].prefVal = a[id].sufVal = val;
a[id].res = a[id].pref = a[id].suf = 1;
a[id].isConnected = true;
a[id].sum = val;
return;
}
push(id, l, r, a);
ll m=(l+r)/2;
if(x <= m){
Set(2*id, l, m, x, val, a);
}else{
Set(2*id+1, m+1, r, x, val, a);
}
a[id] = con(a[2*id], a[2*id+1]);
}
void solve(){
ll n, q, i, type, l, r, s, c;
cin>>n>>q;
vector<ll> d(n+1);
vector<Node> a(4*n + 7);
for(i=1;i<=n;++i){
cin>>d[i];
}
build(1, 0, n, d, a);
for(i=0;i<q;++i){
cin>>type;
if(type == 1){
cin>>l>>r>>s>>c;
auto res2 = get(1, 0, n, 0, r, a);
if(l == r){
add(1, 0, n, l, s, a);
}else{
add(1, 0, n, l, s, a);
add(1, 0, n, l+1, r, c, a);
}
auto res = get(1, 0, n, 0, r, a);
if(r < n){
add(1, 0, n, r+1, res2.sum - res.sum, a);
}
}else if(type == 2){
cin>>l>>r>>s>>c;
auto res = get(1, 0, n, 0, l-1, a);
auto res2 = get(1, 0, n, 0, r, a);
if(l == r){
Set(1, 0, n, l, s - res.sum, a);
}else{
Set(1, 0, n, l, s - res.sum, a);
Set(1, 0, n, l+1, r, c, a);
}
res = get(1, 0, n, 0, r, a);
if(r < n){
add(1, 0, n, r+1, res2.sum - res.sum, a);
}
}else{
cin>>l>>r;
auto res = get(1, 0, n, l+1, r, a);
cout<<res.res + 1<<endl;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
srand(time(nullptr));
ll t=1;
// cin>>t;
for(;t>0;--t){
solve();
}
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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |