n,m = gets.split.map(&:to_i)
t = [0,0].freeze
ab = Array.new(n+1) {|i|
  x = (gets||'0 0').split.map(&:to_i) 
  x[0] <= m ? x : t
}.sort!
h = {}
(n+1).times {|i|
  x = ab[-1-i][0]
  next  if x == h.keys[-1]
  break  if x == 0
  h[x] = n-i
}
h[0] = 0

ks = h.keys.reverse!
v = 0
mi = Array.new(x=h.size)
mv = Array.new(x)
bv = Array.new(x) {|i|
  mi[i], mv[i] = (t[1]<v ? (t=[i,v]) : t)
  v = ab[h[ks[i]]][1]
}

pop_max = lambda {|o,hi;i,x|
    i = mv[o]>bv[o] ? mi[o] : o
    ai = h[hi]
    ai = h[hi] = ab[ai-1][0]==ab[ai][0] ? ai-1 : 0
    max = bv[i]
    bv[i] = v = ab[ai][1]

    return max  if max == mv[o]
    o,x = mv[i]<v ? [i,v] : [mi[i],mv[i]]    
    while v = mv[i+=1]
      break i+=1  if v > max
      if v > x
        t = (o+1)..i
        mi.fill(o,t)
        mv.fill(x,t)
        o,x = i,v
        return max  if o+1 == mv.size
      end
    end
    t = (o+1)...i
    mi.fill(o,t)
    mv.fill(x,t)
    max
  }

ki = 0
p (1..m).inject(0) {|x,i|
  ki += 1  if h[i]
  x + pop_max[ki,ks[ki]]
}