Pagini recente » Cod sursa (job #398235) | Cod sursa (job #2279275) | Cod sursa (job #1871941) | Cod sursa (job #343785) | Cod sursa (job #2567033)
#include <fstream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <string.h>
#include <queue>
#include <stack>
#define INF 0x3f3f3f3f
using namespace std;
#ifdef DEBUG
string name = "data";
#else
string name = "orase";
#endif
ifstream fin(name + ".in");
ofstream fout(name + ".out");
int m, n;
struct Street {
int start;
int length;
int index;
};
vector<Street> streets;
bool compareStreet(Street &s1, Street &s2) {
return s1.start < s2.start;
}
int main() {
fin >> m >> n;
for (int i = 0; i < n; ++i) {
int x, y;
fin >> x >> y;
streets.push_back({x, y, 0});
}
sort(streets.begin(), streets.end(), compareStreet);
for (int i = 0; i < n; ++i) {
streets[i].index = i;
}
auto compare = [](Street lhs, Street rhs) {
return (lhs.length + lhs.start) < (rhs.length + rhs.start);
};
priority_queue<Street, vector<Street>, decltype(compare)> pq(compare);
for (int i = 0; i < n; ++i) {
pq.push(streets[i]);
}
int best = 0;
for (int i = 0; i < n - 1; ++i) {
int offset = streets[i].start;
int startSum = streets[i].length;
while (pq.top().index <= i) {
pq.pop();
}
auto x = pq.top();
int candidate = startSum + (x.start - offset) + x.length;
if (candidate > best) {
best = candidate;
}
}
fout << best;
return 0;
}