Pagini recente » Monitorul de evaluare | Rating eu sunt platina si aur si argint :-> (CopiluMinune) | Rating Tanya Foransbergher (tanyaf) | Rating Serban Petrescu (Gulos) | Cod sursa (job #2058882)
#include <algorithm>
#include <iostream>
using namespace std;
const int MAX_N = 2000;
const int MAX_T = 1500;
const int MAX_P = (int)1e6;
int n, c;
int t[MAX_N], p[MAX_N];
long long v[MAX_T + 1];
long long solve(int price) {
for (int i = 0; i <= MAX_T; ++i) {
v[i] = -c;
}
for (int i = 0; i < n; ++i) {
if (p[i] >= price) {
v[t[i]] += price;
}
}
long long sum = 0, sol = 0, bestSum = 0;
for (int i = 0; i <= MAX_T; ++i) {
sum += v[i];
sol = max(sol, sum - bestSum);
bestSum = min(bestSum, sum);
}
return sol;
}
int main() {
freopen("carnati.in", "r", stdin);
freopen("carnati.out", "w", stdout);
cin >> n >> c;
for (int i = 0; i < n; ++i) {
cin >> t[i] >> p[i];
}
int left = 0, right = MAX_P;
while (right - left >= 10) {
int mid1 = (left * 2 + right) / 3;
int mid2 = (left + 2 * right) / 3;
if (solve(mid1) < solve(mid2)) {
left = mid1;
} else {
right = mid2;
}
}
long long best = 0;
for (int i = left; i < right; ++i) {
best = max(best, solve(i));
}
cout << best << "\n";
}