#include <bits/stdc++.h>
using namespace std;
template <class T>
void mini(T& a, T b) {
  a = min(a, b);
}
template <class T>
void maxi(T& a, T b) {
  a = max(a, b);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> a) {
  return out << a.first << " " << a.second;
}
template <class T>
ostream& operator<<(ostream& out, vector<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, set<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, multiset<T> a) {
  for (auto& i : a) out << i << " ";
  return out;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, map<T1, T2> a) {
  for (auto& i : a) out << i << "\n";
  return out;
}
template <class T1, class T2>
ostream& operator<<(ostream& out, unordered_map<T1, T2> a) {
  for (auto& i : a) out << i << "\n";
  return out;
}
template <class T>
ostream& operator<<(ostream& out, queue<T> a) {
  while (!a.empty()) {
    cout << a.front() << " ";
    a.pop();
  }
  return out;
}
template <class T>
ostream& operator<<(ostream& out, deque<T> a) {
  while (!a.empty()) {
    cout << a.front() << " ";
    a.pop_front();
  }
  return out;
}
template <class T>
ostream& operator<<(ostream& out, priority_queue<T> a) {
  while (!a.empty()) {
    cout << a.top() << "\n";
    a.pop();
  }
  return out;
}
template <class T>
void out(T a) {
  cout << a << endl;
}
template <class T1, class T2>
void out(T1 a, T2 b) {
  cout << a << " " << b << endl;
}
template <class T1, class T2, class T3>
void out(T1 a, T2 b, T3 c) {
  cout << a << " " << b << " " << c << endl;
}
void out() { cout << "OK" << endl; }
template <class T>
void sort(vector<T>& a) {
  sort(a.begin(), a.end());
}
template <class T>
void uniq(vector<T>& a) {
  sort(a);
  a.erase(unique(a.begin(), a.end()), a.end());
}
template <class T>
vector<T> set_int(vector<T> a, vector<T> b) {
  sort(a);
  sort(b);
  vector<T> res;
  set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(res));
  return res;
}
istream& operator>>(istream& in, __int128& a) {
  int64_t b;
  cin >> b;
  a = b;
  return in;
}
ostream& operator<<(ostream& out, const __int128 a) {
  unsigned __int128 b = a < 0 ? -a : a;
  char buf[128];
  char* c = end(buf);
  do {
    --c;
    *c = "0123456789"[b % 10];
    b /= 10;
  } while (b);
  if (a < 0) {
    --c;
    *c = '-';
  }
  int len = end(buf) - c;
  out.rdbuf()->sputn(c, len);
  return out;
}
const int N = 1e5 + 5;
const int inf = 1e9;
vector<int> dp, pr;
vector<bool> used;
vector<int> a[N];
void Solve() {
  int n, k;
  cin >> n >> k;
  int h = 5 * sqrt(k);
  int ans = 0;
  for (int i = 1; i <= k; i++) {
    int r, c;
    cin >> r >> c;
    if (n - r < h)
      a[c - 1].push_back(n - r);
    else
      ans += 3;
  }
  dp.resize(h, 0);
  pr.resize(h, 0);
  used.resize(h, 0);
  for (int i = n - 1; i >= 0; i--) {
    for (int j = 0; j <= h - 1; j++) used[j] = 0;
    for (int j : a[i]) used[j] = 1;
    for (int& j : dp) j = inf;
    int suf = 0;
    for (int j = h - 1; j >= 0; j--) {
      if (used[j]) suf += 3;
      int cur = suf + pr[max(j - 1, 0)];
      mini(dp[j], cur);
      if (j) cur += 2 + j * (j + 1) / 2;
      mini(dp[0], cur);
    }
    for (int j = 0; j <= h - 2; j++) mini(dp[j + 1], dp[j]);
    swap(dp, pr);
  }
  ans += pr[0];
  out(ans);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  Solve();
  return 0;
}
