预处理消除后效性。
ACcode:
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int NS=1000010;
const LL INF=(1LL)<<62;
const double eps=1e-8;
int n,m;
int dp[NS][3];
int main()
{
int fs,st,fe,ed;
while (~scanf("%d",&n),n)
{
scanf("%d%d%d%d",&fs,&st,&fe,&ed);
if (st>ed)
swap(st,ed),swap(fs,fe);
for (int i=1;i<=n;i++)
scanf("%d",&dp[i][0]);
for (int i=0;i<=n;i++)
scanf("%d",&dp[i][2]);
for (int i=1;i<=n;i++)
scanf("%d",&dp[i][1]);
int &t=dp[st][2];
for (int w=0,i=st;i>0;i--)
{
w+=dp[i][0]+dp[i][1];
t=min(t,w+dp[i-1][2]);
if (w>=t) break;
}
int &r=dp[ed][2];
for (int w=0,i=ed+1;i<=n;i++)
{
w+=dp[i][0]+dp[i][1];
r=min(r,w+dp[i][2]);
if (w>=r) break;
}
LL val[2],w;
val[fs]=0; val[!fs]=dp[st][2];
for (int i=st+1;i<=ed;i++)
{
w=val[0];
int x=dp[i][0],y=dp[i][1],z=dp[i][2];
val[0]=min( val[0]+x,val[1]+y+z );
val[1]=min( val[1]+y,w+x+z );
}
LL ans=val[fe];
printf("%I64d\n",ans);
}
return 0;
}