#include <bits/stdc++.h>
using namespace std;
using ll = __int128_t;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
using vi = vector<int>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()
const int mod = 1e9+7;
ll calc(vpl po){
ll ans = 0;
for(ll i = 0; i < po.size()-1; ++i){
ans += (po[i].f+po[i+1].f)*(po[i+1].s-po[i].s);
}
return abs(ans);
}
int draw_territory(int n, int a, int b, vi d, vi l) {
ll per=0;
ll o = l[0];
vpl po={{0,0}};
for(ll i = 0; i < n; ++i){
pll nx = po.back();
per += l[i];
if(d[i]>3){d[i]-=3;l[i]=-l[i];}
if(d[i]!=3)nx.f+=l[i];
if(d[i]!=1)nx.s+=l[i];
po.pb(nx);
}
ll ans = calc(po)+2+per;ans %= mod;
ans *= a;ans %=mod;
ans *= (mod+1)/2;ans %=mod;
ll fir = (ans+mod)%mod;
ll sec = o*(o+1);sec%=mod;
sec *= (2*o+1);sec%=mod;
sec *= (mod*2+1)/6;sec%=mod;
sec -= o*(o+1)/2;sec%=mod;
sec *= b;sec%=mod;
sec += mod;sec%=mod;
return (fir+sec)%mod;
}
// int main() {
// int N, A, B;
// assert(3 == scanf("%d %d %d", &N, &A, &B));
// vi D(N), L(N);
// for (int i = 0; i < N; ++i) {
// assert(2 == scanf("%d %d", &D[i], &L[i]));
// }
// int result = draw_territory(N, A, B, D, L);
// printf("%d\n", result);
// return 0;
// }