#include <bits/stdc++.h>
#define NMAX 50000
using namespace std;
int aintmin[4 * NMAX + 1];
int aintmax[4 * NMAX + 1];
struct oras{
int st, dr;
}v[NMAX + 1];
void update( int v[], int node, int st, int dr, int poz, int val, bool cond ) {
if( st == dr ) {
v[node] = val;
return ;
}
int mid = ( st + dr ) / 2;
if( poz <= mid )
update(v, 2 * node, st, mid, poz, val, cond);
else
update(v, 2 * node + 1, mid + 1, dr, poz, val, cond);
if( cond )
v[node] = max(v[2 * node],v[2 * node + 1]);
}
int query( int v[], int node, int st, int dr, int left, int right, bool cond ) {
if( st == left && dr == right )
return v[node];
int mid = ( st + dr ) / 2;
if( right <= mid )
return query(v,2*node,st,mid,left,right, cond);
else if( left > mid )
return query(v, 2 * node + 1, mid + 1, dr, left, right, cond);
else {
if( cond )
return max( query(v, 2 * node, st, mid, left, mid, cond), query(v, 2 * node + 1, mid + 1, dr, mid + 1, right, cond) );
else
return min( query(v, 2 * node, st, mid, left, mid, cond), query(v, 2 * node + 1, mid + 1, dr, mid + 1, right, cond) );
}
}
bool cmp( oras a, oras b ) {
return a.st < b.st;
}
int main() {
ifstream fin("orase.in");
ofstream fout("orase.out");
int n, i, m;
fin>>m>>n;
for( i = 1; i <= n; i ++ )
fin>>v[i].st>>v[i].dr;
sort( v + 1, v + n + 1, cmp );
for( i = 1; i <= n; i ++ ) {
update(aintmin, 1, 1, n, i, v[i].st - v[i].dr, 0);
update(aintmax, 1, 1, n, i, v[i].st + v[i].dr, 1);
}
int maxdist = 0;
for( i = 2; i < n; i ++ ) {
int x = query(aintmin, 1, 1, n, 1, i - 1,0);
x = v[i].st + v[i].dr - x;
maxdist = max( maxdist, x );
x = query(aintmax, 1, 1, n, i + 1, n, 1);
x = x - ( v[i].st - v[i].dr );
maxdist = max( maxdist, x );
}
fout<<maxdist;
return 0;
}