#include using namespace std; typedef long long LL; const int N = 1e5 + 10; int n; // 运输站点数量 int m; // 货车数量 int x; // 两市距离 struct Node { // 运输点 int p; // 运输站点的位置 int c; // 最多容纳车辆数 } q[N]; bool cmp(Node x, Node y) { // 按到A市的距离从小到大排序 return x.p < y.p; } vector na, nb; // 需要去靠近A市的车和靠近B市的车 LL ans; // 里程合计 int main() { cin >> n >> m >> x; for (int i = 1; i <= n; i++) cin >> q[i].p >> q[i].c; sort(q + 1, q + n + 1, cmp); // 按距离A市的距离将运输点排序 for (int i = 1; i <= m; i++) { // 枚举每个货车 int a, b; cin >> a >> b; if (a >= b) // 到A市次数不低于到B市次数 na.push_back(a - b); // 只记录A市超过B市的次数 else // 到A市次数低于到B市次数 nb.push_back(b - a); // 只记录B市超过A市的次数 ans += 2ll * min(a, b) * x; // 相等的部分计算距离 } sort(na.begin(), na.end(), greater()); // 按去A市的次数从大到小排序 sort(nb.begin(), nb.end(), greater()); // 按去B市的次数从大到小排序 int l = 1, r = n; // 最靠近A市的运输点为1,最靠近B市的运输点为n for (int i = 0; i < na.size(); i++) { // 枚举去A市的车 while (q[l].c == 0) l++; // 没有容量就去下一个运输点 q[l].c--; // 运输点容量减一 ans += 2ll * q[l].p * na[i]; // 计算路程 } for (int i = 0; i < nb.size(); i++) { // 枚举去B市的车 while (q[r].c == 0) r--; // 没有容量就去下一个运输点 q[r].c--; // 运输点容量减一 ans += 2ll * (x - q[r].p) * nb[i]; // 计算路程 } cout << ans << endl; return 0; }