#include <bits/stdc++.h>
using namespace std;
struct timeit {
decltype(chrono::high_resolution_clock::now()) begin;
const string label;
timeit(string label = "???") : label(label) { begin = chrono::high_resolution_clock::now(); }
~timeit() {
auto end = chrono::high_resolution_clock::now();
auto duration = chrono::duration_cast<chrono::milliseconds>(end - begin).count();
cerr << duration << "ms elapsed [" << label << "]" << endl;
}
};
const int MAXN = 1<<8;
int i, j, a[MAXN][MAXN], rows[MAXN], cols[MAXN];
const int NUMITERS = 10000;
int main() {
for (int i=0; i<MAXN; i++) {
rows[i] = i;
cols[i] = i;
}
{
timeit timer("blocked");
int n = MAXN;
int B = 8;
for (int t = 0; t < NUMITERS; t++) {
for (int i = 0; i < n; i += B) {
for (int j = 0; j < n; j += B) {
for (int x = i; x < i + B; x++) {
for (int y = j; y < j + B; y++) {
a[x][y] = rows[x] * cols[y];
}
}
}
}
}
cout<<a[20][20]<<endl;
}
{
timeit x("normal");
int n = MAXN;
for (int t = 0; t < NUMITERS; t++) {
for (i = 0; i < MAXN; i++) {
for (j = 0; j < MAXN; j++) {
a[i][j] = rows[i]*cols[j];
}
}
}
cout<<a[20][20]<<endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgdGltZWl0IHsKICAgIGRlY2x0eXBlKGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSkgYmVnaW47CiAgICBjb25zdCBzdHJpbmcgbGFiZWw7CiAgICB0aW1laXQoc3RyaW5nIGxhYmVsID0gIj8/PyIpIDogbGFiZWwobGFiZWwpIHsgYmVnaW4gPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7IH0KICAgIH50aW1laXQoKSB7CiAgICAgICAgYXV0byBlbmQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICAgICAgYXV0byBkdXJhdGlvbiA9IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om1pbGxpc2Vjb25kcz4oZW5kIC0gYmVnaW4pLmNvdW50KCk7CiAgICAgICAgY2VyciA8PCBkdXJhdGlvbiA8PCAibXMgZWxhcHNlZCBbIiA8PCBsYWJlbCA8PCAiXSIgPDwgZW5kbDsKICAgIH0KfTsKY29uc3QgaW50IE1BWE4gPSAxPDw4OwppbnQgaSwgaiwgYVtNQVhOXVtNQVhOXSwgcm93c1tNQVhOXSwgY29sc1tNQVhOXTsKY29uc3QgaW50IE5VTUlURVJTID0gMTAwMDA7CmludCBtYWluKCkgewogICAgZm9yIChpbnQgaT0wOyBpPE1BWE47IGkrKykgewogICAgICAgIHJvd3NbaV0gPSBpOwogICAgICAgIGNvbHNbaV0gPSBpOwogICAgfQogICAgewogICAgICAgIHRpbWVpdCB0aW1lcigiYmxvY2tlZCIpOwogICAgICAgIGludCBuID0gTUFYTjsKICAgICAgICBpbnQgQiA9IDg7CiAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBOVU1JVEVSUzsgdCsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArPSBCKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGogKz0gQikgewogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBpOyB4IDwgaSArIEI7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gajsgeSA8IGogKyBCOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbeF1beV0gPSByb3dzW3hdICogY29sc1t5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb3V0PDxhWzIwXVsyMF08PGVuZGw7CiAgICB9CiAgICB7CiAgICAgICAgdGltZWl0IHgoIm5vcm1hbCIpOwogICAgICAgIGludCBuID0gTUFYTjsKICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IE5VTUlURVJTOyB0KyspIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWE47IGkrKykgewogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWE47IGorKykgewogICAgICAgICAgICAgICAgICAgIGFbaV1bal0gPSByb3dzW2ldKmNvbHNbal07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY291dDw8YVsyMF1bMjBdPDxlbmRsOwogICAgfQp9Cg==