#include #include #include using uint = uint32_t; struct FastScanner { static constexpr size_t SZ = 1 << 20; char buf[SZ + 32]; size_t l = 0, r = 0; inline void load() { if (l != 0) { std::memmove(buf, buf + l, r - l); r -= l; l = 0; } r += std::fread(buf + r, 1, SZ - r, stdin); // EOF 付近でも数字列を安全に終了させるための番兵 std::memset(buf + r, '\n', 16); } inline uint read_uint() { // uint32 の入力は高々10桁程度なので、 // ここで一度だけ十分な残量を確保する。 if (r - l < 16) { load(); } while (buf[l] < '0') { ++l; } uint x = 0; while (buf[l] >= '0') { x = x * 10 + static_cast(buf[l] & 15); ++l; } return x; } }; struct DigitTable { char d[10000][4]; constexpr DigitTable() : d{} { for (int x = 0; x < 10000; ++x) { d[x][0] = '0' + x / 1000; d[x][1] = '0' + x / 100 % 10; d[x][2] = '0' + x / 10 % 10; d[x][3] = '0' + x % 10; } } }; constexpr DigitTable digit_table; struct FastPrinter { static constexpr size_t SZ = 1 << 20; char buf[SZ]; size_t pos = 0; inline void flush() { std::fwrite(buf, 1, pos, stdout); pos = 0; } inline void ensure() { if (pos + 16 >= SZ) { flush(); } } inline void write4(uint x) { std::memcpy(buf + pos, digit_table.d[x], 4); pos += 4; } inline void write_head(uint x) { const char *s = digit_table.d[x]; if (x >= 1000) buf[pos++] = s[0]; if (x >= 100) buf[pos++] = s[1]; if (x >= 10) buf[pos++] = s[2]; buf[pos++] = s[3]; } inline void write_uint(uint x) { ensure(); if (x >= 100000000) { uint a = x / 100000000; x -= a * 100000000; uint b = x / 10000; uint c = x - b * 10000; write_head(a); write4(b); write4(c); } else if (x >= 10000) { uint a = x / 10000; uint b = x - a * 10000; write_head(a); write4(b); } else { write_head(x); } buf[pos++] = '\n'; } }; static uint S[1000000]; int main() { FastScanner in; FastPrinter out; uint H = in.read_uint(); uint W = in.read_uint(); uint T = 0; for (uint i = 0; i < H; ++i) { uint s = 0; for (uint j = 0; j < W; ++j) { s += in.read_uint(); } S[i] = s; T += s; } for (uint i = 0; i < H; ++i) { out.write_uint(S[i] + T); } out.flush(); }