solution

はい。$O(N)$。

注意点も特にない。

implementation

#include <cstdio>
#include <numeric>
#include <vector>
#define repeat(i, n) for (int i = 0; (i) < int(n); ++(i))
#define whole(f, x, ...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)
using namespace std;
template <class T> inline void setmax(T & a, T const & b) { a = max(a, b); }

int main() {
    while (true) {
        int n, m; scanf("%d%d", &n, &m);
        if (n == 0 and m == 0) break;
        vector<int> v_max(m);
        repeat (i, n) {
            int d, v; scanf("%d%d", &d, &v);
            setmax(v_max[d - 1], v);
        }
        printf("%d\n", whole(accumulate, v_max, 0));
    }
    return 0;
}