-
Notifications
You must be signed in to change notification settings - Fork 3
/
F.cpp
98 lines (98 loc) · 2.52 KB
/
F.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include<bits/stdc++.h>
using namespace std;
#define N 200100
#define ll long long
int n,q;
struct rupq{
ll t[2*N];
void pointAdd(int i,ll v){
for(t[i+=(n+2)]+=v;i>>=1;)t[i]=t[i<<1]+t[i<<1|1];
}
ll rangeQuery(int l,int r){
ll ret=0;
for(l+=n+2,r+=n+3;l<r;l>>=1,r>>=1){
if(l&1)ret+=t[l++];
if(r&1)ret+=t[--r];
}
return ret;
}
void rangeAdd(int l,int r,ll v){
l=max(l,0);
r=min(r,n);
if(l>r)return;
pointAdd(l,v);
pointAdd(r+1,-v);
}
ll query(int i){
return rangeQuery(0,i);
}
}calc;
int arr[N];
ll nxt[N],jump[N];
vector<int>qq[N];
map<int,ll>ans[N];
int qar[N];
ll dp[N];
signed main(){
iostream::sync_with_stdio(false);cin.tie(NULL);
cin>>n>>q;
for(int a=0;a<n;++a)cin>>arr[a];
for(int a=0;a<n;++a)cin>>nxt[a];
for(int a=0;a<n;++a)cin>>jump[a];
//
set<int>pt;
pt.insert(0);
pt.insert(n);
for(int a=0;a<q;++a){
int x;cin>>x;--x;
qar[a]=x;
if(x==0)continue;
auto it=pt.find(x);
if(it!=pt.end()){
qq[*prev(it)].push_back(*next(it));
pt.erase(x);
}
else{
auto it=pt.insert(x).first;
qq[*it].push_back(*next(it));
qq[*prev(it)].push_back(*it);
}
}
qq[0].push_back(n);
//
arr[n]=n+1;
vector<int>incr=vector<int>{n};
for(int a=n-1;a>=0;--a){
while(arr[incr.back()]<arr[a])incr.pop_back();
dp[a]=calc.query(incr.back())+nxt[a];
calc.rangeAdd(incr.back(),n,nxt[a]+min(dp[a],jump[a])-dp[a]);
calc.rangeAdd(a+1,incr.back()-1,nxt[a]);
dp[a]=min(dp[a],jump[a]);
incr.push_back(a);
for(auto r:qq[a]){
ans[a][r]=calc.query(r);
}
}
//
pt.clear();pt.insert(0);pt.insert(n);
ll curAns=ans[0][n];
for(int a=0;a<q;++a){
int x=qar[a];
if(x!=0){
auto it=pt.find(x);
if(it!=pt.end()){
curAns-=ans[*prev(it)][*it];
curAns-=ans[*it][*next(it)];
curAns+=ans[*prev(it)][*next(it)];
pt.erase(x);
}
else{
auto it=pt.insert(x).first;
curAns+=ans[*prev(it)][*it];
curAns+=ans[*it][*next(it)];
curAns-=ans[*prev(it)][*next(it)];
}
}
cout<<curAns<<"\n";
}
}