#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
const ll mod = 1e9 + 7;
const ll inf = 1e18;
void vprint(vector<ll> A) {
  ll L = A.size();
  for (ll i = (0); i < (L); ++i) {
    if (i) cout << ' ';
    cout << A[i];
  }
  cout << endl;
}
struct Show {
  ll start;
  ll end;
  Show(ll s, ll e) {
    start = s;
    end = e;
  }
  bool operator<(const Show &another) const { return end < another.end; }
  string ToString() {
    stringstream ss;
    ss << start << ' ' << end;
    return ss.str();
  }
  static bool sortByStart(Show a, Show b) { return a.start < b.start; }
};
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll N, x, y;
  cin >> N >> x >> y;
  vector<Show> A;
  for (ll i = (0); i < (N); ++i) {
    ll l, r;
    cin >> l >> r;
    A.push_back(Show(l, r));
  }
  sort((A).begin(), (A).end(), Show::sortByStart);
  ll cost = 0;
  multiset<Show> se;
  for (ll i = (0); i < (N); ++i) {
    auto show = A[i];
    ll dist = -1;
    auto it = se.lower_bound(Show(show.start, show.start));
    if (se.size() > 0 && it != se.begin()) {
      it--;
      dist = distance(se.begin(), it);
    }
    if (dist >= 0 && it->end < show.start) {
      ll empty_time = show.start - it->end;
      if (empty_time * y <= x) {
        se.erase(it);
        se.insert(show);
        cost += (empty_time + show.end - show.start) * y;
        cost %= mod;
        continue;
      }
    }
    cost += x + (show.end - show.start) * y;
    cost %= mod;
    se.insert(show);
  }
  cout << (cost) << endl;
  return 0;
}
