import java.io.Closeable ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.PrintWriter ;
import java.util.NoSuchElementException ;
import java.util.Scanner ;
public class Main {
public static void main
( String [ ] args
) { test( "10000000.txt" ,10000000 ,1 ,1 ,1000000000 ) ;
}
public static void test
( String filename,
int h,
int w,
int min,
int max
) { try {
generate( filename, h, w, min, max) ;
bm1( filename) ;
bm2( filename) ;
bm3( filename) ;
e.printStackTrace ( ) ;
}
}
public static void generate
( String filename,
int h,
int w,
int min,
int max
) { pw.println ( h + " " + w) ;
for ( int i= 0 ; i< h; i++ ) {
for ( int j= 0 ; j< w; j++ ) {
if ( j > 0 ) {
pw.print ( ' ' ) ;
}
pw.print ( randomInt( min, max) ) ;
}
pw.println ( ) ;
}
e.printStackTrace ( ) ;
}
}
public static int randomInt( int min,int max) {
return ( int ) ( Math .
random ( ) * ( max
- min
+ 1 ) ) + min
; }
long stime
= System .
nanoTime ( ) ; Scanner sc
= new Scanner
( new File ( filename
) ) ; int h = sc.nextInt ( ) ;
int w = sc.nextInt ( ) ;
long sum = 0 ;
for ( int i= 0 ; i< h; i++ ) {
for ( int j= 0 ; j< w; j++ ) {
sum += sc.nextInt ( ) ;
}
}
System .
out .
println ( ( System .
nanoTime ( ) - stime
) / 1000000 + " ms" ) ; sc.close ( ) ;
}
long stime
= System .
nanoTime ( ) ; Scanner sc
= new Scanner
( new File ( filename
) ) ; int h
= Integer .
parseInt ( sc.
next ( ) ) ; int w
= Integer .
parseInt ( sc.
next ( ) ) ; long sum = 0 ;
for ( int i= 0 ; i< h; i++ ) {
for ( int j= 0 ; j< w; j++ ) {
sum
+= Integer .
parseInt ( sc.
next ( ) ) ; }
}
System .
out .
println ( ( System .
nanoTime ( ) - stime
) / 1000000 + " ms" ) ; sc.close ( ) ;
}
long stime
= System .
nanoTime ( ) ; int h = sc.nextInt ( ) ;
int w = sc.nextInt ( ) ;
long sum = 0 ;
for ( int i= 0 ; i< h; i++ ) {
for ( int j= 0 ; j< w; j++ ) {
sum += sc.nextInt ( ) ;
}
}
System .
out .
println ( ( System .
nanoTime ( ) - stime
) / 1000000 + " ms" ) ; sc.close ( ) ;
}
}
class FastScanner implements Closeable {
private final byte [ ] buffer = new byte [ 1024 ] ;
private int ptr = 0 ;
private int buflen = 0 ;
this .in = in;
}
private boolean hasNextByte( ) {
if ( ptr < buflen) {
return true ;
} else {
ptr = 0 ;
try {
buflen = in.read ( buffer) ;
e.printStackTrace ( ) ;
}
if ( buflen <= 0 ) {
return false ;
}
}
return true ;
}
private int readByte( ) { if ( hasNextByte( ) ) return buffer[ ptr++ ] ; else return - 1 ; }
private static boolean isPrintableChar( int c) { return 33 <= c && c <= 126 ; }
public boolean hasNext( ) { while ( hasNextByte( ) && ! isPrintableChar( buffer[ ptr] ) ) ptr++; return hasNextByte( ) ; }
StringBuilder sb = new StringBuilder( ) ;
int b = readByte( ) ;
while ( isPrintableChar( b) ) {
sb.appendCodePoint ( b) ;
b = readByte( ) ;
}
return sb.toString ( ) ;
}
public long nextLong( ) {
long n = 0 ;
boolean minus = false ;
int b = readByte( ) ;
if ( b == '-' ) {
minus = true ;
b = readByte( ) ;
}
if ( b < '0' || '9' < b) {
}
while ( true ) {
if ( '0' <= b && b <= '9' ) {
n *= 10 ;
n += b - '0' ;
} else if ( b == - 1 || ! isPrintableChar( b) ) {
return minus ? - n : n;
} else {
}
b = readByte( ) ;
}
}
public int nextInt( ) {
long nl = nextLong( ) ;
return ( int ) nl;
}
public double nextDouble
( ) { return Double .
parseDouble ( next
( ) ) ; } public void close( ) {
try {
in.close ( ) ;
}
}
}
aW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJdGVzdCgiMTAwMDAwMDAudHh0IiwxMDAwMDAwMCwxLDEsMTAwMDAwMDAwMCk7Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgdGVzdChTdHJpbmcgZmlsZW5hbWUsaW50IGgsaW50IHcsaW50IG1pbixpbnQgbWF4KSB7CgkJdHJ5IHsKCQkJZ2VuZXJhdGUoZmlsZW5hbWUsIGgsIHcsIG1pbiwgbWF4KTsKCQkJYm0xKGZpbGVuYW1lKTsKCQkJYm0yKGZpbGVuYW1lKTsKCQkJYm0zKGZpbGVuYW1lKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoJfQoJcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyBmaWxlbmFtZSxpbnQgaCxpbnQgdyxpbnQgbWluLGludCBtYXgpIHsKCQl0cnkoUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoZmlsZW5hbWUpKSB7CgkJCXB3LnByaW50bG4oaCArICIgIiArIHcpOwoJCQlmb3IoaW50IGk9MDtpPGg7aSsrKSB7CgkJCQlmb3IoaW50IGo9MDtqPHc7aisrKSB7CgkJCQkJaWYgKGogPiAwKSB7CgkJCQkJCXB3LnByaW50KCcgJyk7CgkJCQkJfQoJCQkJCXB3LnByaW50KHJhbmRvbUludChtaW4sIG1heCkpOwoJCQkJfQoJCQkJcHcucHJpbnRsbigpOwoJCQl9CgkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQl9Cgl9CglwdWJsaWMgc3RhdGljIGludCByYW5kb21JbnQoaW50IG1pbixpbnQgbWF4KSB7CgkJcmV0dXJuIChpbnQpIChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsKCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBibTEoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKCQlsb25nIHN0aW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJU2Nhbm5lciBzYyA9IG5ldyBTY2FubmVyKG5ldyBGaWxlKGZpbGVuYW1lKSk7CgkJaW50IGggPSBzYy5uZXh0SW50KCk7CgkJaW50IHcgPSBzYy5uZXh0SW50KCk7CgkJbG9uZyBzdW0gPSAwOwoJCWZvcihpbnQgaT0wO2k8aDtpKyspIHsKCQkJZm9yKGludCBqPTA7ajx3O2orKykgewoJCQkJc3VtICs9IHNjLm5leHRJbnQoKTsKCQkJfQoJCX0KCQlTeXN0ZW0ub3V0LnByaW50bG4oc3VtKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oKFN5c3RlbS5uYW5vVGltZSgpIC0gc3RpbWUpIC8gMTAwMDAwMCArICIgbXMiKTsKCQlzYy5jbG9zZSgpOwoJfQoJcHVibGljIHN0YXRpYyB2b2lkIGJtMihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewoJCWxvbmcgc3RpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlTY2FubmVyIHNjID0gbmV3IFNjYW5uZXIobmV3IEZpbGUoZmlsZW5hbWUpKTsKCQlpbnQgaCA9IEludGVnZXIucGFyc2VJbnQoc2MubmV4dCgpKTsKCQlpbnQgdyA9IEludGVnZXIucGFyc2VJbnQoc2MubmV4dCgpKTsKCQlsb25nIHN1bSA9IDA7CgkJZm9yKGludCBpPTA7aTxoO2krKykgewoJCQlmb3IoaW50IGo9MDtqPHc7aisrKSB7CgkJCQlzdW0gKz0gSW50ZWdlci5wYXJzZUludChzYy5uZXh0KCkpOwoJCQl9CgkJfQoJCVN5c3RlbS5vdXQucHJpbnRsbihzdW0pOwoJCVN5c3RlbS5vdXQucHJpbnRsbigoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGltZSkgLyAxMDAwMDAwICsgIiBtcyIpOwoJCXNjLmNsb3NlKCk7Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgYm0zKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CgkJbG9uZyBzdGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOwoJCUZhc3RTY2FubmVyIHNjID0gbmV3IEZhc3RTY2FubmVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKCQlpbnQgaCA9IHNjLm5leHRJbnQoKTsKCQlpbnQgdyA9IHNjLm5leHRJbnQoKTsKCQlsb25nIHN1bSA9IDA7CgkJZm9yKGludCBpPTA7aTxoO2krKykgewoJCQlmb3IoaW50IGo9MDtqPHc7aisrKSB7CgkJCQlzdW0gKz0gc2MubmV4dEludCgpOwoJCQl9CgkJfQoJCVN5c3RlbS5vdXQucHJpbnRsbihzdW0pOwoJCVN5c3RlbS5vdXQucHJpbnRsbigoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGltZSkgLyAxMDAwMDAwICsgIiBtcyIpOwoJCXNjLmNsb3NlKCk7Cgl9Cn0KY2xhc3MgRmFzdFNjYW5uZXIgaW1wbGVtZW50cyBDbG9zZWFibGUgewoJcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbjsKCXByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwoJcHJpdmF0ZSBpbnQgcHRyID0gMDsKCXByaXZhdGUgaW50IGJ1ZmxlbiA9IDA7CglwdWJsaWMgRmFzdFNjYW5uZXIoSW5wdXRTdHJlYW0gaW4pIHsKCQl0aGlzLmluID0gaW47Cgl9Cglwcml2YXRlIGJvb2xlYW4gaGFzTmV4dEJ5dGUoKSB7CgkJaWYgKHB0ciA8IGJ1ZmxlbikgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9ZWxzZXsKCQkJcHRyID0gMDsKCQkJdHJ5IHsKCQkJCWJ1ZmxlbiA9IGluLnJlYWQoYnVmZmVyKTsKCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJfQoJCQlpZiAoYnVmbGVuIDw9IDApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCXByaXZhdGUgaW50IHJlYWRCeXRlKCkgeyBpZiAoaGFzTmV4dEJ5dGUoKSkgcmV0dXJuIGJ1ZmZlcltwdHIrK107IGVsc2UgcmV0dXJuIC0xO30KCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmludGFibGVDaGFyKGludCBjKSB7IHJldHVybiAzMyA8PSBjICYmIGMgPD0gMTI2O30KCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7IHdoaWxlKGhhc05leHRCeXRlKCkgJiYgIWlzUHJpbnRhYmxlQ2hhcihidWZmZXJbcHRyXSkpIHB0cisrOyByZXR1cm4gaGFzTmV4dEJ5dGUoKTt9CglwdWJsaWMgU3RyaW5nIG5leHQoKSB7CgkJaWYgKCFoYXNOZXh0KCkpIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CgkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgkJaW50IGIgPSByZWFkQnl0ZSgpOwoJCXdoaWxlKGlzUHJpbnRhYmxlQ2hhcihiKSkgewoJCQlzYi5hcHBlbmRDb2RlUG9pbnQoYik7CgkJCWIgPSByZWFkQnl0ZSgpOwoJCX0KCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCX0KCXB1YmxpYyBsb25nIG5leHRMb25nKCkgewoJCWlmICghaGFzTmV4dCgpKSB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwoJCWxvbmcgbiA9IDA7CgkJYm9vbGVhbiBtaW51cyA9IGZhbHNlOwoJCWludCBiID0gcmVhZEJ5dGUoKTsKCQlpZiAoYiA9PSAnLScpIHsKCQkJbWludXMgPSB0cnVlOwoJCQliID0gcmVhZEJ5dGUoKTsKCQl9CgkJaWYgKGIgPCAnMCcgfHwgJzknIDwgYikgewoJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CgkJfQoJCXdoaWxlKHRydWUpewoJCQlpZiAoJzAnIDw9IGIgJiYgYiA8PSAnOScpIHsKCQkJCW4gKj0gMTA7CgkJCQluICs9IGIgLSAnMCc7CgkJCX1lbHNlIGlmKGIgPT0gLTEgfHwgIWlzUHJpbnRhYmxlQ2hhcihiKSl7CgkJCQlyZXR1cm4gbWludXMgPyAtbiA6IG47CgkJCX1lbHNlewoJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwoJCQl9CgkJCWIgPSByZWFkQnl0ZSgpOwoJCX0KCX0KCXB1YmxpYyBpbnQgbmV4dEludCgpIHsKCQlsb25nIG5sID0gbmV4dExvbmcoKTsKCQlpZiAobmwgPCBJbnRlZ2VyLk1JTl9WQUxVRSB8fCBubCA+IEludGVnZXIuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CgkJcmV0dXJuIChpbnQpIG5sOwoJfQoJcHVibGljIGRvdWJsZSBuZXh0RG91YmxlKCkgeyByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKG5leHQoKSk7fQoJcHVibGljIHZvaWQgY2xvc2UoKSB7CgkJdHJ5IHsKCQkJaW4uY2xvc2UoKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJfQoJfQp9