#line 2 "nachia\\misc\\fastio.hpp" #include #include #include #include namespace nachia{ const unsigned int INPUT_BUF_SIZE = 1 << 17; const unsigned int OUTPUT_BUF_SIZE = 1 << 17; char input_buf[INPUT_BUF_SIZE]; struct InputBufIterator{ private: unsigned int p = INPUT_BUF_SIZE; public: using MyType = InputBufIterator; char seekChar(){ if(p == INPUT_BUF_SIZE){ size_t len = fread(input_buf, 1, INPUT_BUF_SIZE, stdin); if(len != INPUT_BUF_SIZE) input_buf[len] = '\0'; p = 0; } return input_buf[p]; } void skipWhitespace(){ while(isspace(seekChar())) p++; } unsigned int nextUint(){ skipWhitespace(); unsigned int buf = 0; while(true){ char tmp = seekChar(); if('9' < tmp || tmp < '0') break; buf = buf * 10 + (tmp - '0'); p++; } return buf; } int nextInt(){ skipWhitespace(); if(seekChar() == '-'){ p++; return (int)(-nextUint()); } return (int)nextUint(); } unsigned long long nextUlong(){ skipWhitespace(); unsigned long long buf = 0; while(true){ char tmp = seekChar(); if('9' < tmp || tmp < '0') break; buf = buf * 10 + (tmp - '0'); p++; } return buf; } long long nextLong(){ skipWhitespace(); if(seekChar() == '-'){ p++; return (long long)(-nextUlong()); } return (long long)nextUlong(); } char nextChar(){ skipWhitespace(); char buf = seekChar(); p++; return buf; } std::string nextToken(){ skipWhitespace(); std::string buf; while(true){ char ch = seekChar(); if(isspace(ch) || ch == '\0') break; buf.push_back(ch); p++; } return buf; } MyType& operator>>(unsigned int& dest){ dest = nextUint(); return *this; } MyType& operator>>(int& dest){ dest = nextInt(); return *this; } MyType& operator>>(unsigned long& dest){ dest = nextUlong(); return *this; } MyType& operator>>(long& dest){ dest = nextLong(); return *this; } MyType& operator>>(unsigned long long& dest){ dest = nextUlong(); return *this; } MyType& operator>>(long long& dest){ dest = nextLong(); return *this; } MyType& operator>>(std::string& dest){ dest = nextToken(); return *this; } MyType& operator>>(char& dest){ dest = nextChar(); return *this; } }; char output_buf[OUTPUT_BUF_SIZE] = {}; struct FastOutputTable{ char LZ[1000][4] = {}; char NLZ[1000][4] = {}; constexpr FastOutputTable(){ using u32 = uint_fast32_t; for(u32 d=0; d<1000; d++){ u32 x = d, i = 0; LZ[d][i++] = ('0' + x / 100 % 10); LZ[d][i++] = ('0' + x / 10 % 10); LZ[d][i++] = ('0' + x / 1 % 10); LZ[d][i++] = '\0'; } for(u32 d=0; d<1000; d++){ u32 x = d, i = 0; if(x >= 100) NLZ[d][i++] = ('0' + x / 100 % 10); if(x >= 10) NLZ[d][i++] = ('0' + x / 10 % 10); if(x >= 1) NLZ[d][i++] = ('0' + x / 1 % 10); NLZ[d][i++] = '\0'; } } }; struct OutputBufIterator{ using u32 = uint_fast32_t; using u64 = uint_fast64_t; using MyType = OutputBufIterator; static constexpr FastOutputTable TB = FastOutputTable(); u32 p = 0; static constexpr u32 POW10(int d){ return (d<=0) ? 1 : (POW10(d-1)*10); } static constexpr u64 POW10LL(int d){ return (d<=0) ? 1 : (POW10LL(d-1)*10); } void nextChar(char c){ output_buf[p++] = c; if(p == OUTPUT_BUF_SIZE){ fwrite(output_buf, p, 1, stdout); p = 0; } } void next_eoln(){ nextChar('\n'); } void nextCstr(const char* s){ while(*s) nextChar(*(s++)); } void next_dig9(u32 x){ u32 y; y = x / POW10(6); x -= y * POW10(6); nextCstr(TB.LZ[y]); y = x / POW10(3); x -= y * POW10(3); nextCstr(TB.LZ[y]); y = x; nextCstr(TB.LZ[y]); } void nextUint(unsigned int x){ unsigned int y = 0; if(x >= POW10(9)){ y = x / POW10(9); x -= y * POW10(9); nextCstr(TB.NLZ[y]); next_dig9(x); } else if(x >= POW10(6)){ y = x / POW10(6); x -= y * POW10(6); nextCstr(TB.NLZ[y]); y = x / POW10(3); x -= y * POW10(3); nextCstr(TB.LZ[y]); nextCstr(TB.LZ[x]); } else if(x >= POW10(3)){ y = x / POW10(3); x -= y * POW10(3); nextCstr(TB.NLZ[y]); nextCstr(TB.LZ[x]); } else if(x >= 1){ nextCstr(TB.NLZ[x]); } else{ nextChar('0'); } } void nextInt(int x){ if(x >= 0) nextUint(x); else{ nextChar('-'); nextUint((unsigned int)-x); } } void nextUlong(unsigned long long x){ u32 y = 0; if(x >= POW10LL(18)){ y = x / POW10LL(18); x -= y * POW10LL(18); nextUint(y); y = x / POW10LL(9); x -= y * POW10LL(9); next_dig9(y); next_dig9(x); } else if(x >= POW10LL(9)){ y = x / POW10LL(9); x -= y * POW10LL(9); nextUint(y); next_dig9(x); } else{ nextUint(x); } } void nextLong(long long x){ if(x >= 0) nextUlong(x); else{ nextChar('-'); nextUlong((unsigned long long)-x); } } void writeToFile(bool flush = false){ fwrite(output_buf, p, 1, stdout); if(flush) fflush(stdout); p = 0; } ~OutputBufIterator(){ writeToFile(); } MyType& operator<<(unsigned int tg){ nextUint(tg); return *this; } MyType& operator<<(unsigned long tg){ nextUlong(tg); return *this; } MyType& operator<<(unsigned long long tg){ nextUlong(tg); return *this; } MyType& operator<<(int tg){ nextInt(tg); return *this; } MyType& operator<<(long tg){ nextLong(tg); return *this; } MyType& operator<<(long long tg){ nextLong(tg); return *this; } MyType& operator<<(const std::string& tg){ nextCstr(tg.c_str()); return *this; } MyType& operator<<(const char* tg){ nextCstr(tg); return *this; } MyType& operator<<(char tg){ nextChar(tg); return *this; } }; } // namespace nachia #line 2 "Main.cpp" #include #include #define rep(i,n) for(int i=0; i<(int)(n); i++) int main(){ nachia::InputBufIterator cin; nachia::OutputBufIterator cout; int N, M; cin >> N >> M; std::vector dp(M, 0); std::vector A(M, 0); rep(i,N){ rep(j,M) cin >> A[j]; rep(j,M) dp[j] += A[j]; long long mdp = *std::min_element(dp.begin(), dp.end()); rep(j,M) dp[j] = std::min(dp[j], mdp + A[j]); } long long ans = *std::min_element(dp.begin(), dp.end()); if(N == 1) ans = 0; cout << ans << '\n'; return 0; }