#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
const int maxn = 1e5 + 10, P = 1e9 + 7;
inline char gc() {
  return getchar();
  static const int maxs = 1 << 16;
  static char buf[maxs], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, maxs, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long rd() {
  long long x = 0;
  char c = gc();
  bool neg = 0;
  while (c < '0' || c > '9') {
    if (c == '-') neg = 1;
    c = gc();
  }
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = gc();
  return neg ? (~x + 1) : x;
}
pair<long long, long long> q[maxn];
multiset<int> tv;
int N;
long long x, y;
int main() {
  int i, j, k;
  N = rd(), x = rd(), y = rd();
  for (i = 1; i <= N; i++) {
    q[i].first = rd(), q[i].second = rd();
  }
  sort(q + 1, q + N + 1);
  tv.insert(1e9 + 1);
  long long ans = 0;
  for (i = 1; i <= N; i++) {
    multiset<int>::iterator it = tv.lower_bound(q[i].first);
    if (it != tv.begin()) {
      int r = *(--it);
      ans = (ans + min(y * (q[i].first - r), x)) % P;
      tv.erase(it);
    } else
      ans = (ans + x) % P;
    tv.insert(q[i].second);
    ans = (ans + y * (q[i].second - q[i].first)) % P;
  }
  printf("%d\n", (ans + P) % P);
  return 0;
}
