mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-08-21 10:42:07 +00:00
update
This commit is contained in:
parent
aa083e8c6f
commit
3204ce5c1e
92
src/8/19/segmatrixdp.cpp
Normal file
92
src/8/19/segmatrixdp.cpp
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user