require 'set'

N, K = gets.split(' ').map(&:to_i)
td_list = N.times.map { gets.split(' ').map(&:to_i) }

sorted_td_list = td_list.sort_by { |(_, d)| -d }
first_td_list = sorted_td_list.take(K)
t_to_size = Hash.new(0).tap do |h|
  first_td_list.each { |k, _| h[k] += 1 }
end
t_set = Set.new(t_to_size.keys)
max_score = first_td_list.reduce(0) do |acc, (_, d)|
  acc + d
end + t_set.size ** 2
current_score = max_score

rest_sorted_td_list = sorted_td_list.drop(K)
rest_sorted_td_list.each.with_index do |(t, d), i|
  break if t_set.size >= K
  next if t_set.include?(t)
  deleted_t = nil
  deleted_d = nil
  (P + i).downto(0) do |n|
    t, d = sorted_td_list[n]
    if t_to_size[t] >= 2
      deleted_t = t
      deleted_d = d
      break
    end
  end
  break unless deleted_t
  t_set.add(t)
  t_to_size[deleted_t] -= 1
  current_score = current_score + (d + (t_set.size ** 2)) - (d2 + ((t_set.size - 1) ** 2))
  max_score = current_score if max_score < current_score
end
puts max_score
