#include #include #include #include #include #include #include int main() { // 入力データの取得(mmapを優先し、不可ならfreadへフォールバック) struct stat st; const char* ptr = nullptr; std::vector in_buf; if (fstat(STDIN_FILENO, &st) == 0 && st.st_size > 0) { void* addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, STDIN_FILENO, 0); if (addr != MAP_FAILED) { ptr = static_cast(addr); } } if (!ptr) { constexpr size_t BUF_SIZE = 64 * 1024 * 1024; // 64MB in_buf.resize(BUF_SIZE); size_t size = fread(in_buf.data(), 1, BUF_SIZE, stdin); in_buf[size] = '\0'; ptr = in_buf.data(); } // ポインタ直接操作による高速数値読み込み auto read_uint = [&ptr]() -> uint32_t { while (*ptr <= ' ' && *ptr != '\0') ++ptr; uint32_t x = 0; while (*ptr >= '0' && *ptr <= '9') { x = x * 10 + (*ptr - '0'); ++ptr; } return x; }; uint32_t H = read_uint(); uint32_t W = read_uint(); std::vector S(H, 0); uint32_t T = 0; for (uint32_t i = 0; i < H; ++i) { uint32_t row_sum = 0; for (uint32_t j = 0; j < W; ++j) { row_sum += read_uint(); } S[i] = row_sum; T += row_sum; } // 出力バッファによる一括書き出し constexpr size_t OUT_BUF_SIZE = 16 * 1024 * 1024; // 16MB std::vector out_buf(OUT_BUF_SIZE); char* out_ptr = out_buf.data(); for (uint32_t i = 0; i < H; ++i) { uint32_t x = S[i] + T; if (x == 0) { *out_ptr++ = '0'; } else { char digits[12]; int len = 0; while (x > 0) { digits[len++] = static_cast('0' + (x % 10)); x /= 10; } while (len > 0) { *out_ptr++ = digits[--len]; } } *out_ptr++ = '\n'; // バッファ容量チェック if (out_ptr - out_buf.data() > OUT_BUF_SIZE - 64) { fwrite(out_buf.data(), 1, out_ptr - out_buf.data(), stdout); out_ptr = out_buf.data(); } } if (out_ptr > out_buf.data()) { fwrite(out_buf.data(), 1, out_ptr - out_buf.data(), stdout); } return 0; }