#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;


const int PUNO = 1000000000; 
const int MAXN = 100010;

struct dio{
       int kuca, raz;
       dio(){ kuca = 0; raz = 0; }
       dio(int kuca_, int raz_){ kuca = kuca_; raz = raz_; }
};
bool operator <(const dio &a, const dio &b){
     if (a.kuca != b.kuca) return a.kuca < b.kuca;
     return a.raz < b.raz;
}
struct sve {
      int maks;
      int zbroj;
      int koji;
      sve() { zbroj = 0; maks = -PUNO; koji = 0;}
   };
int offset;
vector<sve> V;
int a, b;

struct dio2{
       int velik, koji;
       dio2(){ velik = 0; koji = 0;}
       dio2(int a, int b){ velik = a; koji = b; }
};

void dodaj(int i, int broj){
     i += offset;
     V[i].maks = broj;
     V[i].koji = i - offset;
     for (i = i / 2; i > 0; i /= 2){
         if (V[2*i].maks > V[2*i+1].maks){ V[i].maks = V[2*i].maks; V[i].koji = V[2*i].koji; }
         else{ V[i].maks = V[2*i+1].maks; V[i].koji = V[2*i+1].koji; }
     }
}
int zbroj(int i, int lo, int hi) {
   if(a >= hi || b <= lo) return 0;
   if(lo >= a && hi <= b) return V[i].zbroj;
   return zbroj(2*i, lo, (lo+hi)/2) + zbroj(2*i+1, (lo+hi)/2, hi);
}
int zbroji(int lo, int hi) { a = lo; b = hi; return zbroj( 1, 0, offset ); }   
dio2 naj(int i, int lo, int hi){
    if( a >= hi || b <= lo ) return dio2(-PUNO, 0);
    if( lo >= a && hi <= b ) return dio2(V[i].maks, V[i].koji);
    dio2 tma, tmb;
    tma = (naj(2*i, lo, (lo+hi)/2));
    tmb = (naj(2*i+1, (lo+hi)/2, hi));
    if (tma.velik > tmb.velik) return tma;
    return tmb;
}
dio2 najveci(int lo, int hi){
    a = lo; b = hi;
    return naj(1, 0, offset);
}

int n, aa, bb, c, t;
int kuce, rj;
dio niz[MAXN];
int lijevi, desni;
dio2 rjt, rjtt, rjl, rjd;

int main(){
    scanf("%d%d", &n, &kuce);
    for (offset = 1; offset < n; offset *= 2);
    V.resize(2 * offset);
    /*
   for (int i = 0; i < n; ++i){
       scanf("%d", &t);
       dodaj(i, t);
   }
   scanf("%d", &c);
   for (int i = 0; i < c; ++i){
       scanf("%d%d", &aa, &bb);
       dio2 tmp = najveci(aa, bb);
       printf("%d %d\n", tmp.velik, tmp.koji);             
   }
   */
    for (int i = 0; i < n; ++i){ scanf("%d%d", &niz[i].kuca, &niz[i].raz); niz[i].kuca--; }
//    printf("--\n");
    sort(niz, niz + n);
    for (int i = 0; i < n; ++i)
        dodaj(i, niz[i].raz);
    lijevi = 0; desni = n - 1;    
    rj = 0;
    while (lijevi < desni){
          rjt = najveci(lijevi + 1, desni + 1); 
          rjtt = najveci(lijevi, desni);
          rjl = najveci(lijevi, lijevi + 1);
          rjd = najveci(desni, desni + 1);
//          .velik .koji
          if (rjl.velik <= rjt.velik){
            rj += rjl.velik;
            dodaj(rjl.koji, 0);
            dodaj(rjt.koji, rjt.velik - rjl.velik);
            lijevi++;
          }
          else if (rjd.velik <= rjtt.velik){
            rj += rjd.velik;
            dodaj(rjd.koji, 0);
            dodaj(rjtt.koji, rjtt.velik - rjd.velik);
            desni--;
          }
          if (najveci(desni, desni + 1).velik == 0) desni--;
    }
    if (lijevi == desni) rj += najveci(lijevi, lijevi + 1).velik;
    printf("%d\n", rj);
   return 0;
}
       
        
