#define ll long long
const int MOD = 1e9 + 7; // 998244353;
const int N = 2e5 + 5;
const ll INF = 1e16;
ll a[N];
struct SegTree
{
ll st[4 * N][4];
SegTree(int init_size)
{
build(1, init_size, 1);
}
ll get_mx(int id) {
return max({st[id][0], st[id][1], st[id][2], st[id][3]});
}
void merge(int lid, int rid, int id)
{
st[id][0] = max(st[lid][0] + st[rid][2], st[lid][1] + max(st[rid][2], st[rid][0]));
st[id][1] = max(st[lid][0] + st[rid][3], st[lid][1] + max(st[rid][1], st[rid][3]));
st[id][2] = max(st[lid][2] + st[rid][2], st[lid][3] + max(st[rid][2], st[rid][0]));
st[id][3] = max(st[lid][2] + st[rid][3], st[lid][3] + max(st[rid][1], st[rid][3]));
}
void build(int l, int r, int id)
{
if (l == r)
{
st[id][0] = max(a[l], 0LL);
for (int i = 1; i < 4; i++) st[id][i] = 0;
return;
}
int mid = (l + r) / 2;
build(l, mid, id << 1);
build(mid + 1, r, id << 1 | 1);
merge(id << 1, id << 1 | 1, id);
}
void update(ll val, int u, int v, int l, int r, int id)
{
if (v < l || u > r)
{
return;
}
if (l == r)
{
st[id][0] = max(val, 0LL);
return;
}
int mid = (l + r) / 2;
update(val, u, v, l, mid, id << 1);
update(val, u, v, mid + 1, r, id << 1 | 1);
merge(id << 1, id << 1 | 1, id);
}
};
class Solution {
public:
int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
int ans = 0;
int n = nums.size();
for (int i = 1; i <= n; i++){
a[i] = nums[i-1];
}
SegTree st = SegTree(n);
for (auto query: queries) {
int val = query[1], pos = query[0] + 1;
st.update(val, pos, pos, 1, n, 1);
ans = (ans + st.get_mx(1)) % MOD;
}
return ans;
}
};