Pagini recente » Cod sursa (job #887249) | Cod sursa (job #2149467) | Cod sursa (job #1143692) | Cod sursa (job #245240) | Cod sursa (job #847803)
Cod sursa(job #847803)
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<algorithm>
#define infile "orase.in"
#define outfile "orase.out"
#define nMax 50005
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define FOR(g)\
for(vector<pii>::iterator it=g.begin(); it!=g.end(); ++it)
using namespace std;
struct oras{
int dist, lg;
}v[nMax];
int N, M;
int Sol;
void read(){
ifstream f(infile);
f >> M >> N;
for(int i=1; i<=N; ++i)
f >> v[i].dist >> v[i].lg;
f.close();
}
bool cmp(const oras &a, const oras &b){
if(a.dist != b.dist)
return a.dist < b.dist;
return a.lg < b.lg;
}
int dfs(int idx, int x){
if(idx > N)
return -INF;
int m1 = v[idx++].lg , m2 = 0;
while(v[idx].dist == x){
if(v[idx].lg > m1){ m2 = m1; m1 = v[idx].lg;}
else if(v[idx].lg > m2) m2 = v[idx].lg;
++ idx;
}
int r = dfs(idx, v[idx].dist) + v[idx].dist - v[idx - 1].dist;
if(r > m1){ m2 = m1; m1 = r; }
else if(r > m2) m2 = r;
Sol = max(Sol, m1 + m2);
return m1;
}
void solve(){
sort(v+1, v+N+1, cmp);
dfs(1, v[1].dist);
}
void print(){
ofstream g(outfile);
g << Sol << '\n';
g.close();
}
int main(){
read();
solve();
print();
return 0;
}