由于每一维对答案的贡献独立,考虑从小到大枚举一个变量c,降为二维(a,b),此时约束条件有两种:a<x||b<y,a<x&&b<y,可以用平衡树(可用std::set)维护max(b)关于a的函数(非严格递减,约束条件相当于对后缀取min,每次修改后更新答案)(如果用线段树维护则需要标记回收),用堆维护当前的最优解
#include<bits/stdc++.h>
const int N=100007,RN=1e5;
char buf[N],*ptr=buf+RN;
int G(){
if(ptr==buf+RN)fread(ptr=buf,1,RN,stdin);
return *ptr++;
}
int _(){
int x=0;
if(ptr<buf+RN-100){
while(*ptr<48)++ptr;
while(*ptr>47)x=x*10+*ptr++-48;
}else{
int c=G();
while(c<48)c=G();
while(c>47)x=x*10+c-48,c=G();
}
return x;
}
void maxs(int&a,int b){if(a<b)a=b;}
void mins(int&a,int b){if(a>b)a=b;}
int n,v[3][N],p,ws[2][N],xs[N],ks[N];
std::priority_queue<int>q,qd;
struct pos{
mutable int l,x,y;
bool operator<(pos w)const{return x<w.x;}
void ins()const{q.push(v[1][x]+y);}
void del()const{qd.push(v[1][x]+y);}
}ps[N];
typedef std::set<pos>ST;
typedef ST::iterator IT;
ST st;
void cal(int x,int y){
IT it=st.lower_bound((pos){0,x,0}),it_del;
if(it->y<=y)return;
int r1=-1;
if(it->l<x){
r1=it->x;
it->del();
it->x=x-1;
it->ins();
++it;
}
for(;it!=st.end()&&it->y>y;it->del(),r1=it->x,it_del=it,++it,st.erase(it_del));
st.insert((pos){x,r1,y}).first->ins();
}
int qmx(){
while(qd.size()&&q.top()==qd.top())q.pop(),qd.pop();
return q.top();
}
void work(){
q=std::priority_queue<int>();
qd=std::priority_queue<int>();
st.clear();
n=_();
for(int i=1;i<=n;++i)ks[i]=_();
for(int i=1;i<=n;++i)xs[i]=_();
for(int t=0;t<2;++t){
for(int i=1;i<=n;++i)ws[t][_()]=i;
}
for(int t=0;t<3;++t){
for(int i=1;i<=n;++i)v[t][i]=v[t][i-1]+_();
}
st.insert((pos){0,n,v[2][n]}).first->ins();
for(int i=1;i<=n;++i)if(ks[i]==1)cal(ws[0][i],v[2][ws[1][i]-1]);
int ans=qmx();
for(int i=1;i<=n;++i){
int x=xs[i];
int xp=ws[0][x],yp=ws[1][x];
if(ks[x]==1){
cal(0,v[2][yp-1]);
cal(xp,-0x3f3f3f3f);
}else{
cal(xp,v[2][yp-1]);
}
maxs(ans,qmx()+v[0][i]);
}
printf("%d\n",ans);
}
int main(){
_();
for(int T=_();T;--T)work();
return 0;
}