mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-21 14:41:45 +00:00
Compare commits
No commits in common. "3204ce5c1e6ebe1b34c5f83854df91742b5349a7" and "3e421f198cd636e5dc31ac82723f01c15836b899" have entirely different histories.
3204ce5c1e
...
3e421f198c
@ -1,92 +0,0 @@
|
|||||||
#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