#include #include #include #include #include #include namespace fastio{ static constexpr uint32_t buf_size=1<<17; char ibuf[buf_size]; char obuf[buf_size]; uint32_t pil=0,pir=0,por=0; struct Pre{ char t[40000]; constexpr Pre(){ for(int i=0;i<10000;i++){ int n=i; for(int j=3;j>=0;j--){ t[i*4+j]='0'+n%10; n/=10; } } } }constexpr pre; inline void load(){ if(pir-pil<=pil)memcpy(ibuf,ibuf+pil,pir-pil); else memmove(ibuf,ibuf+pil,pir-pil); pir=pir-pil+fread(ibuf+pir-pil,1,buf_size-pir+pil,stdin); pil=0; } inline void flush(){ fwrite(obuf,1,por,stdout); por=0; } inline void rd(char&c){c=ibuf[pil++];} inline void rd(std::string&s){ char c; s.clear(); if(pil==pir)load(); rd(c); if(pil==pir)load(); while(!std::isspace(c)){ s+=c; rd(c); if(pil==pir)load(); } } inline void rd(__int128_t&x){ if(pil+50>pir)load(); char c; do rd(c); while(c<'-'); bool neg=false; if(c=='-'){ neg=true; rd(c); } x=0; while(c>='0'){ x=x*10+(c&15); rd(c); } if(neg)x=-x; } template inline void rd(T&x){ if(pil+32>pir)load(); char c; do rd(c); while(c<'-'); bool neg=false; if constexpr(std::is_signed_v){ if(c=='-'){ neg=true; rd(c); } } x=0; while(c>='0'){ x=x*10+(c&15); rd(c); } if constexpr(std::is_signed_v){ if(neg)x=-x; } } inline void wt(char x){obuf[por++]=x;} template,std::nullptr_t> =nullptr> inline void wt(T x){ if(por+32>buf_size)flush(); if(x==0){ wt('0'); return; } if constexpr(std::is_signed_v){ if(x<0){ wt('-'); x=-x; } } if(x>=10000000000000000){ uint32_t r1=x%100000000; uint64_t q1=x/100000000; uint32_t r2=q1%100000000; uint32_t q2=q1/100000000; uint32_t n1=r1%10000,n2=r1/10000,n3=r2%10000,n4=r2/10000; if(x>=1000000000000000000){ if constexpr(std::is_unsigned_v){ if(x>=10000000000000000000ull){ obuf[por++]='1'; } } memcpy(obuf+por,pre.t+(q2<<2)+1,3); memcpy(obuf+por+3,pre.t+(n4<<2),4); memcpy(obuf+por+7,pre.t+(n3<<2),4); memcpy(obuf+por+11,pre.t+(n2<<2),4); memcpy(obuf+por+15,pre.t+(n1<<2),4); por+=19; } else if(x>=100000000000000000){ uint32_t q3=(q2*205)>>11; uint32_t r3=q2-q3*10; obuf[por]='0'+q3; obuf[por+1]='0'+r3; memcpy(obuf+por+2,pre.t+(n4<<2),4); memcpy(obuf+por+6,pre.t+(n3<<2),4); memcpy(obuf+por+10,pre.t+(n2<<2),4); memcpy(obuf+por+14,pre.t+(n1<<2),4); por+=18; } else{ obuf[por]='0'+q2; memcpy(obuf+por+1,pre.t+(n4<<2),4); memcpy(obuf+por+5,pre.t+(n3<<2),4); memcpy(obuf+por+9,pre.t+(n2<<2),4); memcpy(obuf+por+13,pre.t+(n1<<2),4); por+=17; } } else{ static char buf[12]; int i=8; while(x>=10000){ memcpy(buf+i,pre.t+((x%10000)<<2),4); x/=10000; i-=4; } if(x<100){ if(x<10)obuf[por++]='0'+x; else{ obuf[por]='0'+x/10; obuf[por+1]='0'+x%10; por+=2; } } else{ if(x<1000){ memcpy(obuf+por,pre.t+(x<<2)+1,3); por+=3; } else{ memcpy(obuf+por,pre.t+(x<<2),4); por+=4; } } memcpy(obuf+por,buf+i+4,8-i); por+=8-i; } } inline void wt(const std::string&s){ int sz=s.size(); if(por+sz>buf_size)flush(); memcpy(obuf+por,s.c_str(),sz); por+=sz; } inline void wt(__int128_t x){ if(por+50>buf_size)flush(); if(x==0){ wt('0'); return; } if(x<0){ wt('-'); x=-x; } static constexpr __int128_t b=10000000000000000000ull; if(x>=b){ wt(x/b); unsigned long long y=x%b; memcpy(obuf+por,pre.t+((y/10000000000000000)<<2)+1,3); memcpy(obuf+por+3,pre.t+((y/1000000000000%10000)<<2),4); memcpy(obuf+por+7,pre.t+((y/100000000%10000)<<2),4); memcpy(obuf+por+11,pre.t+((y/10000%10000)<<2),4); memcpy(obuf+por+15,pre.t+((y%10000)<<2),4); por+=19; } else wt(x); } struct Dummy{ Dummy(){std::atexit(flush);} }dummy; } using fastio::rd; using fastio::wt; #include using namespace std; int main(){ int h,w; rd(h),rd(w); vectora(h); unsigned s=0; for(int i=0;i