This commit is contained in:
Zengtudor 2025-08-19 19:26:00 +08:00
parent aa083e8c6f
commit 3204ce5c1e

92
src/8/19/segmatrixdp.cpp Normal file
View File

@ -0,0 +1,92 @@
#include <algorithm>
#include <climits>
#include <cstdint>
#include <iostream>
#include <vector>
using ll = int64_t;
const ll INF = INT_MAX;
struct M22{
std::vector<std::vector<ll>> v{2,std::vector<ll>(2)};
M22 operator*(const M22&o){
M22 n;
n.v[0][0]=std::max(v[0][0]+o.v[0][0],v[0][1]+o.v[1][0]);
n.v[0][1]=std::max(v[0][0]+o.v[0][1],v[0][1]+o.v[1][1]);
n.v[1][0]=std::max(v[1][0]+o.v[0][0],v[1][1]+o.v[1][0]);
n.v[1][1]=std::max(v[1][0]+o.v[0][1],v[1][1]+o.v[1][1]);
return n;
}
M22&operator*=(const M22&o){
*this= *this * o;
return *this;
}
};
std::vector<M22> t;
std::vector<M22> nums;
M22 create(ll l, ll r, ll idx) {
if (l == r) {
t[idx] = nums[l];
return t[idx];
}
ll mid = (l + r) / 2;
t[idx] = create(mid + 1, r, 2 * idx + 2)*create(l, mid, 2 * idx + 1);
return t[idx];
}
void update(ll l, ll r, ll idx, ll pos,const M22&val) {
if (l == r) {
t[idx] = val;
return;
}
ll mid = (l + r) / 2;
if (pos <= mid) {
update(l, mid, 2 * idx + 1, pos, val);
} else {
update(mid + 1, r, 2 * idx + 2, pos, val);
}
t[idx] = t[2 * idx + 2]*t[2 * idx + 1];
}
M22 query(ll cur,ll ql,ll qr,ll l,ll r){
if(qr<l || r<ql)return M22{{{0, -INF}, {-INF, 0}}};
if(ql<=l && r<=qr)return t[cur];
ll mid = (l+r)/2;
return query(cur*2+2, ql, qr, mid+1, r)*query(cur*2+1, ql, qr, l, mid);
}
int main(){
ll n;
std::cin>>n;
ll q;
std::cin>>q;
t.resize(4*n);
nums.resize(n);
std::vector<ll> a(n),b(n);
for(ll i=0; i<n; i++){
std::cin>>a[i];
std::cin>>b[i];
}
for(ll i=0;i<n;i++){
nums[i].v[0][0]=a[i];
nums[i].v[0][1]=b[i];
nums[i].v[1][1]=INT_MIN;
}
create(0, n - 1, 0);
const auto output=[&](){
M22 nm = query(0, 0, n-1, 0, n-1);
std::cout<< std::max(nm.v[0][0] , nm.v[0][1]) <<'\n';
};
output();
while(q--){
ll idx;
std::cin>>idx;
--idx;
std::cin>>a[idx]>>b[idx];
update(0, n - 1, 0, idx, M22{{{a[idx],b[idx]},{0,INT_MIN}}});
output();
}
std::cin>>q;
}