Problem:
歩くサンタクロース(Walking Santa)
昨年末，サンタクロースはJOI 村の子供たちにクリスマスプレゼントを渡すのを忘れてしまった．そこで，お詫びの気持ちとして子供たちにチョコレートケーキを届けることにした．届けるべき日は明日に迫っているので，そろそろ移動計画を考えなければならない．
JOI 村は，南北方向にまっすぐに伸びる
W
本の道路と，東西方向にまっすぐに伸びる
H
本の道路により，碁盤の目の形に区分けされている. 南北方向の
W
本の道路には，西から順に1, 2, ... ,
W
の番号が付けられており，東西方向の
H
本の道路には，南から順に1, 2, ... ,
H
の番号が付けられている. 西から
x
番目の南北方向の道路と，南から
y
番目の東西方向の道路が交わる交差点を(
x
,
y
) で表す. JOI 村には
N
軒の家があり，それらはいずれかの交差点に位置している. サンタクロースは道路に沿ってのみ移動することができる. 隣り合う交差点の間を移動するのにかかる時間を1 とする.
JOI 村のすべての家には子供がいるので，サンタクロースはJOI 村のすべての家に1 個ずつチョコレートケーキを届けてまわらなければならない. 大切なチョコレートケーキを持ってトナカイと空を飛びまわるのはやや危険であるので，サンタクロースとトナカイはJOI 村のいずれかの交差点に降り立ち，サンタクロースがそこから歩いてチョコレートケーキを届けることにした. サンタクロースは同時に2 個以上のチョコレートケーキを運んで歩くことはしない．つまり，サンタクロースはチョコレートケーキを1 軒の家に届けるたびに降り立った交差点に戻る．
サンタクロースは，JOI 村に降り立ってからすべての家にチョコレートケーキを届けるまでの所要時間が最小になるような移動計画を選ぶことにした．ここで，最後の家にチョコレートケーキを届けてから降り立った交差点に戻るまでの時間は所要時間に含めないことに注意せよ．また，移動にかかる時間以外は考えない．
課題
家の位置の情報が与えられたとき，サンタクロースが降り立つ交差点をうまく選んだ場合の，JOI 村に降り立ってからすべての家にチョコレートケーキを届けるまでの所要時間の最小値と，所要時間を最小にするために降り立つべき交差点の位置を求めるプログラムを作成せよ．
制限
1 ≤
W
≤ 1000000000 = 10
9
南北方向に伸びる道路の本数
1 ≤
H
≤ 1000000000 = 10
9
東西方向に伸びる道路の本数
1 ≤
N
≤ 100000 = 10
5
家の数
1 ≤
X
i
≤
W
i
番目の家の位置の, 南北方向に伸びる道路の番号
1 ≤
Y
i
≤
H
i
番目の家の位置の, 東西方向に伸びる道路の番号
入力
標準入力から以下の入力を読み込め．
1 行目には各方向の道路の本数を表す整数
W
,
H
が空白を区切りとして書かれている．
2 行目には家の数を表す整数
N
が書かれている．
続く
N
行には，家の位置の情報が書かれている．
i
+ 2 行目(1 ≤
i
≤
N
) には整数
X
i
,
Y
i
が空白を区切りとして書かれており，
i
番目の家が交差点(
X
i
,
Y
i
) に位置していることを表す．これら
N
個の交差点はすべて異なる．
出力
標準出力に以下のデータを出力せよ．
1 行目には所要時間の最小値を表す1 つの整数が書かれていなければならない．
2 行目には所要時間を最小にするために降り立つべき交差点が(
x
,
y
) であるとき，2 つの整数
x
,
y
がこの順に空白を区切りとして書かれていなければならない．適切な交差点が複数ある場合は，そのうち最も西にある(つまり，
x
の値が小さい) 交差点を, それでも1 つに定まらない場合は, さらにそのうちで最も南にある(つまり，
y
の値が小さい) 交差点を選べ.
注意
この問題では，扱う整数の範囲が32 ビットに収まらない可能性があることに注意せよ．
採点基準
採点用データのうち，配点の40%分については，
N
≤ 1000 を満たす．
採点用データのうち，配点の10%分については，
W
≤ 50,
H
≤ 50,
N
≤ 1000 を満たす．
入出力の例
入力例1
5 4
3
1 1
3 4
5 3
出力例1
10
3 3
たとえば，次のような移動計画により所要時間を最小にできる．
交差点(3; 3) に降り立つ．
交差点(3; 4) に位置している家にチョコレートケーキを届ける．ここまでの経過時間は1 である．
交差点(3; 3) に戻る．ここまでの経過時間は2 である．
交差点(5; 3) に位置している家にチョコレートケーキを届ける．ここまでの経過時間は4 である．
交差点(3; 3) に戻る．ここまでの経過時間は6 である．
交差点(1; 1) に位置している家にチョコレートケーキを届ける．ここまでの経過時間は10 である．
入力例2
4 6
8
1 3
3 2
4 4
2 5
2 3
3 3
3 4
2 4
出力例2
21
2 3
家がある交差点に降り立ってもよいことに注意せよ．
問題文と自動審判に使われるデータは、
情報オリンピック日本委員会
が作成し公開している問題文と採点用テストデータです。

Submitted solutions:

code_snippet: #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long x[200000], y[200000], n, H, W;
vector<long long>X, Y; vector<pair<long long, long long>>candidate;
long long dists(long long px, long long py) {
	vector<long long>RR; long long sum = 0;
	for (int i = 0; i < n; i++) {
		long long TT = abs(px - x[i]) + abs(py - y[i]);
		RR.push_back(TT); sum += TT;
	}
	sort(RR.begin(), RR.end());
	return sum * 2 - RR[RR.size() - 1];
}
int main() {
	cin >> H >> W >> n; for (int i = 0; i < n; i++) { cin >> x[i] >> y[i]; X.push_back(x[i]); Y.push_back(y[i]); }
	sort(X.begin(), X.end()); sort(Y.begin(), Y.end());
	vector<long long>HH, WW;
	if (n % 2 == 1) { HH.push_back(X[X.size() / 2]); WW.push_back(Y[Y.size() / 2]); }
	if (n % 2 == 0) {
		HH.push_back(X[X.size() / 2 - 1]); HH.push_back(X[X.size() / 2]);
		WW.push_back(Y[Y.size() / 2 - 1]); WW.push_back(Y[Y.size() / 2]);
	}
	unique(X.begin(), X.end()); unique(Y.begin(), Y.end());
	int pos1 = lower_bound(X.begin(), X.end(), HH[0]) - X.begin();
	int pos2 = lower_bound(Y.begin(), Y.end(), WW[0]) - Y.begin();
	int pos3 = 0, pos4 = 0;
	if (n % 2 == 0) {
		int pos1 = lower_bound(X.begin(), X.end(), HH[1]) - X.begin();
		int pos2 = lower_bound(Y.begin(), Y.end(), WW[1]) - Y.begin();
	}
	if (pos1 >= 1) { HH.push_back(X[pos1 - 1]); }
	if (pos1 < X.size() - 1 && n % 2 == 1) { HH.push_back(X[pos1 + 1]); }
	if (pos3 < X.size() - 1 && n % 2 == 0) { HH.push_back(X[pos3 + 1]); }
	if (pos2 >= 1) { WW.push_back(Y[pos2 - 1]); }
	if (pos2 < Y.size() - 1 && n % 2 == 1) { WW.push_back(Y[pos2 + 1]); }
	if (pos4 < Y.size() - 1 && n % 2 == 0) { WW.push_back(Y[pos4 + 1]); }
	for (int i = 0; i < HH.size(); i++) { for (int j = 0; j < WW.size(); j++)candidate.push_back(make_pair(HH[i], WW[j])); }
	long long minx = 999999999999999999LL, mx = 0, my = 0; sort(candidate.begin(), candidate.end());
	for (int i = 0; i < candidate.size(); i++) {
		long long UU = dists(candidate[i].first, candidate[i].second);
		if (minx > UU) { minx = UU; mx = candidate[i].first; my = candidate[i].second; }
	}
	cout << minx << endl << mx << ' ' << my << endl;
	return 0;
}
accuracy: 1
time_ms: 130
memory_kb: 8100
final_rank: 19

code_snippet: #include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

// 家の座標を格納する構造体
struct House {
    long long int x, y;
};

int main(void){
    // 入力速度を高速化
    ios::sync_with_stdio(false);
    cin.tie(0);

    int W, H, N;
    // 入力: 南北方向道路の本数 W, 東西方向道路の本数 H, 家の数 N
    scanf("%d %d %d", &W, &H, &N);

    // 家の情報を格納する配列とベクター
    vector<House> houses(N);
    vector<long long int> hx, hy;

    // 各家の座標を入力
    for(int i = 0; i < N; i++){
        scanf("%lld %lld", &houses[i].x, &houses[i].y);
        hx.push_back(houses[i].x);
        hy.push_back(houses[i].y);
    }

    // x座標とy座標をそれぞれソート
    sort(hx.begin(), hx.end());
    sort(hy.begin(), hy.end());

    // 中央値の数を決定（奇数の場合は1、偶数の場合は2）
    int xp = (hx.size() + 1) % 2 + 1; // 奇数なら1、偶数なら2
    int yp = (hy.size() + 1) % 2 + 1;

    // ソート後のサイズ
    int xs = hx.size();
    int ys = hy.size();

    // 中央値を格納する配列（最大2つ）
    long long int x[2] = {0};
    long long int y[2] = {0};

    // x座標の中央値を選定
    for(int i = 0; i < xp; i++) {
        x[i] = hx[xs / 2 + i - xp / 2];
    }

    // y座標の中央値を選定
    for(int i = 0; i < yp; i++) {
        y[i] = hy[ys / 2 + i - yp / 2];
    }

    // 最小総移動時間とその際の交差点を初期化
    long long int ans = 1LL << 62; // 十分に大きな値
    long long int ax = 0, ay = 0;

    // 各候補の交差点についてループ
    for(int i = 0; i < xp; i++){
        long long int nx = x[i]; // 候補のx座標
        for(int j = 0; j < yp; j++){
            long long int ny = y[j]; // 候補のy座標
            long long int nmax = 0;   // 最も遠い家への距離
            long long int temp = 0;    // 総移動時間

            // すべての家に対して距離を計算
            for(long long int l = 0; l < N; l++){
                long long int lx = nx - houses[l].x;
                long long int ly = ny - houses[l].y;

                // マンハッタン距離の絶対値を計算
                lx = (lx >= 0) ? lx : -lx;
                ly = (ly >= 0) ? ly : -ly;
                long long int dist = lx + ly;

                // 最も遠い家への距離を更新
                if(nmax < dist) nmax = dist;

                // 往復の移動時間を計算
                long long int tamp = dist * 2;
                temp += tamp;
            }

            // 最後の家への往路の移動時間を引く
            temp -= nmax;

            // 最小総移動時間と交差点を更新
            if(temp < ans){
                ans = temp;
                ax = nx;
                ay = ny;
            }
            // 同じ総移動時間の場合は、最も西、さらに最も南の交差点を選ぶ
            else if(temp == ans){
                if(nx < ax || (nx == ax && ny < ay)){
                    ax = nx;
                    ay = ny;
                }
            }
        }
    }

    // 結果を出力
    printf("%lld\n%lld %lld\n", ans, ax, ay);
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6632
final_rank: 16

code_snippet: #include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;

long long LXY[2][100000], XY[2][100000];

int main() {
  long long sum = 0LL, osum = 0LL;
  long long w, h, L, HL, temp, oxy[2][2], ox, oy, max = 0, dx, dy;

  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (int f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0][f1] = LXY[0][f1];
    XY[1][f1] = LXY[1][f1];
  }
  sort(XY[0], XY[0] + L);
  sort(XY[1], XY[1] + L);

  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (int f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (int f2 = 0; f2 < dx; f2++) {
      for (int f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (int f1 = 0; f1 < L; f1++) {
          temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if(max < temp) max = temp;
        }
        sum = sum*2 - max;
        if(osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 5920
final_rank: 2

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
    long long sum = 0LL, osum = 0LL;
    long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], LXY[2][100000], ox, oy, max = 0, dx, dy;
    vector<long long> XY[2];

    cin >> w >> h;
    cin >> L;

    for (f1 = 0; f1 < L; f1++) {
        cin >> LXY[0][f1] >> LXY[1][f1];
        XY[0].push_back(LXY[0][f1]);
        XY[1].push_back(LXY[1][f1]);
    }

    // Sort the points based on both x and y coordinates simultaneously
    sort(XY[0].begin(), XY[0].end());
    sort(XY[1].begin(), XY[1].end());

    HL = (L + 1) / 2;

    if (L == 1) {
        cout << "0" << endl;
        cout << LXY[0][0] << " " << LXY[1][0] << endl;
    } else {
        for (f1 = 0; f1 < 2; f1++) {
            oxy[0][f1] = XY[f1][HL - 1];
            oxy[1][f1] = XY[f1][HL];
        }

        dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
        dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;

        // Optimize the loop by unrolling and minimizing redundant calculations
        for (f2 = 0; f2 < dx; f2++) {
            for (f3 = 0; f3 < dy; f3++) {
                sum = 0LL;
                max = 0LL;

                for (f1 = 0; f1 < L; f1++) {
                    temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
                    sum += temp;
                    if (max < temp)
                        max = temp;
                }

                sum *= 2;
                sum -= max;

                if (osum == 0 || osum > sum) {
                    osum = sum;
                    ox = oxy[f2][0];
                    oy = oxy[f3][1];
                }
            }
        }

        cout << osum << endl;
        cout << ox << " " << oy << endl;
    }

    return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 6340
final_rank: 17

code_snippet: #include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  long long w, h, L, HL;
  cin >> w >> h >> L;

  vector<long long> LXY[2], XY[2];
  LXY[0].resize(L);
  LXY[1].resize(L);

  for (int f1 = 0; f1 < L; f1++) {
    cin >> LXY[0][f1] >> LXY[1][f1];
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }

  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(), XY[1].end());

  HL = (L + 1) / 2;
  if (L == 1) {
    cout << 0 << "\n" << LXY[0][0] << " " << LXY[1][0] << "\n";
  } else {
    long long oxy[2][2], ox, oy;
    int dx, dy;
    for (int f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    long long osum = 0, sum;
    for (int f2 = 0; f2 < dx; f2++) {
      for (int f3 = 0; f3 < dy; f3++) {
        sum = 0;
        long long max = 0;
        for (int f1 = 0; f1 < L; f1++) {
          long long temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum = sum * 2 - max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    cout << osum << "\n" << ox << " " << oy << "\n";
  }
  return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 6348
final_rank: 18

code_snippet: #include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], ox, oy, max = 0, dx, dy;
  vector<long long> LXY[2], XY[2];

  cin >> w >> h;
  cin >> L;
  LXY[0].resize(L);
  LXY[1].resize(L);
  
  for (f1 = 0; f1 < L; f1++) {
    cin >> LXY[0][f1] >> LXY[1][f1];
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }

  partial_sort(XY[0].begin(), XY[0].begin() + L, XY[0].end());
  partial_sort(XY[1].begin(), XY[1].begin() + L, XY[1].end());

  HL = (L + 1) / 2;
  if (L == 1) {
    cout << "0\n";
    cout << LXY[0][0] << " " << LXY[1][0] << "\n";
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    cout << osum << "\n";
    cout << ox << " " << oy << "\n";
  }
  return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 6372
final_rank: 11

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vvvb = vector<vvb>;
#define all(A) A.begin(),A.end()
#define rep(i, n) for (ll i = 0; i < (ll) (n); i++)
template<class T>
bool chmax(T& p, T q, bool C = 1) {
    if (C == 0 && p == q) {
        return 1;
    }
    if (p < q) {
        p = q;
        return 1;
    }
    else {
        return 0;
    }
}
template<class T>
bool chmin(T& p, T q, bool C = 1) {
    if (C == 0 && p == q) {
        return 1;
    }
    if (p > q) {
        p = q;
        return 1;
    }
    else {
        return 0;
    }
}

int main() {

    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    ll N;

    cin>>N>>N>>N;
    vll A(N),B(N);
    rep(i,N)cin>>A[i]>>B[i];
    vll P=A,Q=B;
    sort(all(A));
    sort(all(B));
    ll AN=1e18,y=-1,x=-1;
    for(ll d=N/2-5;d<=N/2+5;d++){
        for(ll e=N/2-5;e<=N/2+5;e++){
            if(0>d||d>=N||e<0||e>=N)continue;
            ll S=0;
            ll M=0;
            rep(i,N){
                ll cost=abs(A[d]-P[i])+abs(B[e]-Q[i]);
                chmax(M,cost);
                S+=cost*2;
            }
            S-=M;
            if(chmin(AN,S)){
                y=A[d];
                x=B[e];
            }
        }
    }
    cout<<AN<<endl;
    cout<<y<<" "<<x<<endl;

}
accuracy: 1
time_ms: 30
memory_kb: 6276
final_rank: 10

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  LXY[0] = new long long[L];
  LXY[1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    oxy[0][0] = XY[0][HL - 1];
    oxy[1][0] = XY[0][HL];
    oxy[0][1] = XY[1][HL - 1];
    oxy[1][1] = XY[1][HL];
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        long long max = 0LL;
        sum = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          max = (max < temp) ? temp : max;
        }
        sum = (sum << 1) - max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  delete[] LXY[0];
  delete[] LXY[1];
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6328
final_rank: 3

code_snippet: #include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    long long w, h, L, HL, ox, oy, osum = 0LL, max = 0LL, dx, dy;
    vector<long long> XY[2], LXY[2];
    scanf("%lld %lld %lld", &w, &h, &L);
    LXY[0].resize(L);
    LXY[1].resize(L);
    for (long long f1 = 0; f1 < L; f1++) {
        scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
        XY[0].push_back(LXY[0][f1]);
        XY[1].push_back(LXY[1][f1]);
    }
    sort(XY[0].begin(), XY[0].end());
    sort(XY[1].begin(), XY[1].end());
    HL = (L + 1) / 2;
    if (L == 1) {
        printf("0\n%lld %lld\n", LXY[0][0], LXY[1][0]);
    } else {
        long long oxy[2][2] = { { XY[0][HL - 1], XY[1][HL - 1] }, { XY[0][HL], XY[1][HL] } };
        dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
        dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
        for (long long f2 = 0; f2 < dx; f2++) {
            for (long long f3 = 0; f3 < dy; f3++) {
                long long sum = 0LL;
                max = 0LL;
                for (long long f1 = 0; f1 < L; f1++) {
                    long long temp = abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
                    sum += temp;
                    max = (max < temp) ? temp : max;
                }
                sum = (sum << 1) - max;
                if (osum == 0 || osum > sum) {
                    osum = sum;
                    ox = oxy[f2][0];
                    oy = oxy[f3][1];
                }
            }
        }
        printf("%lld\n%lld %lld\n", osum, ox, oy);
    }
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 5816
final_rank: 1

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6328
final_rank: 3

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  stable_sort(XY[0].begin(), XY[0].end());
  stable_sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6596
final_rank: 12

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  LXY[0] = new long long[L];
  LXY[1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  delete[] LXY[0];
  delete[] LXY[1];
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6344
final_rank: 6

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
    long long sum = 0LL, osum = 0LL;
    long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0, dx, dy;
    vector<long long> XY[2];
    scanf("%lld %lld", &w, &h);
    scanf("%lld", &L);
    for (f1 = 0; f1 < 2; f1++) {
        LXY[f1] = new long long[L];
    }
    for (f1 = 0; f1 < L; f1++) {
        scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
        XY[0].push_back(LXY[0][f1]);
        XY[1].push_back(LXY[1][f1]);
    }
    stable_sort(XY[0].begin(), XY[0].end());
    stable_sort(XY[1].begin(), XY[1].end());
    HL = (L + 1) / 2;
    if (L == 1) {
        printf("0\n");
        printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
        return 0;
    }
    for (f1 = 0; f1 < 2; f1++) {
        oxy[0][f1] = XY[f1][HL - 1];
        oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
        for (f3 = 0; f3 < dy; f3++) {
            sum = 0LL;
            max = 0LL;
            for (f1 = 0; f1 < L; f1++) {
                temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
                sum += temp;
                if (max < temp) {
                    max = temp;
                }
            }
            sum *= 2;
            sum -= max;
            if (osum == 0 || osum > sum) {
                osum = sum;
                ox = oxy[f2][0];
                oy = oxy[f3][1];
            }
        }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6612
final_rank: 13

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], ox, oy, max = 0, dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  long long LXY[2][L]; // allocate array on stack
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  stable_sort(XY[0].begin(), XY[0].end());
  stable_sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6612
final_rank: 13

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0LL, dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (int f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (int f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  stable_sort(XY[0].begin(), XY[0].end());
  stable_sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (int f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (int f2 = 0; f2 < dx; f2++) {
      for (int f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (int f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  for (int f1 = 0; f1 < 2; f1++)
    delete[] LXY[f1];
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6612
final_rank: 13

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    long long sum = 0LL, osum = 0LL;
    long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0, dx, dy;
    vector<long long> XY[2];
    scanf("%lld %lld", &w, &h);
    scanf("%lld", &L);
    for (f1 = 0; f1 < 2; f1++)
        LXY[f1] = new long long[L];
    for (f1 = 0; f1 < L; f1++) {
        scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
        XY[0].push_back(LXY[0][f1]);
        XY[1].push_back(LXY[1][f1]);
    }
    sort(XY[0].begin(), XY[0].end());
    sort(XY[1].begin(), XY[1].end());
    HL = (L + 1) / 2;
    if (L == 1) {
        printf("0\n");
        printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
    } else {
        for (f1 = 0; f1 < 2; f1++) {
            oxy[0][f1] = XY[f1][HL - 1];
            oxy[1][f1] = XY[f1][HL];
        }
        dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
        dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
        for (f2 = 0; f2 < dx; f2++) {
            for (f3 = 0; f3 < dy; f3++) {
                sum = 0LL;
                max = 0LL;
                for (f1 = 0; f1 < L; f1++) {
                    temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) + abs(LXY[1][f1] - oxy[f3][1]);
                    sum += temp;
                    if (max < temp)
                        max = temp;
                }
                sum *= 2;
                sum -= max;
                if (osum == 0 || osum > sum) {
                    osum = sum;
                    ox = oxy[f2][0];
                    oy = oxy[f3][1];
                }
            }
        }
        printf("%lld\n", osum);
        printf("%lld %lld\n", ox, oy);
    }
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6344
final_rank: 6

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6344
final_rank: 6

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  sort(XY[0].begin(), XY[0].end());
  sort(XY[1].begin(),XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6344
final_rank: 6

code_snippet: #include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  long long sum = 0LL, osum = 0LL;
  long long f1, f2, f3, w, h, L, HL, temp, oxy[2][2], *LXY[2], ox, oy, max = 0,
                                                                       dx, dy;
  vector<long long> XY[2];
  scanf("%lld %lld", &w, &h);
  scanf("%lld", &L);
  for (f1 = 0; f1 < 2; f1++)
    LXY[f1] = new long long[L];
  for (f1 = 0; f1 < L; f1++) {
    scanf("%lld %lld", &LXY[0][f1], &LXY[1][f1]);
    XY[0].push_back(LXY[0][f1]);
    XY[1].push_back(LXY[1][f1]);
  }
  std::sort(XY[0].begin(), XY[0].end());
  std::sort(XY[1].begin(), XY[1].end());
  HL = (L + 1) / 2;
  if (L == 1) {
    printf("0\n");
    printf("%lld %lld\n", LXY[0][0], LXY[1][0]);
  } else {
    for (f1 = 0; f1 < 2; f1++) {
      oxy[0][f1] = XY[f1][HL - 1];
      oxy[1][f1] = XY[f1][HL];
    }
    dx = (oxy[0][0] == oxy[1][0]) ? 1 : 2;
    dy = (oxy[0][1] == oxy[1][1]) ? 1 : 2;
    for (f2 = 0; f2 < dx; f2++) {
      for (f3 = 0; f3 < dy; f3++) {
        sum = 0LL;
        max = 0LL;
        for (f1 = 0; f1 < L; f1++) {
          temp = (long long)abs(LXY[0][f1] - oxy[f2][0]) +
                 abs(LXY[1][f1] - oxy[f3][1]);
          sum += temp;
          if (max < temp)
            max = temp;
        }
        sum *= 2;
        sum -= max;
        if (osum == 0 || osum > sum) {
          osum = sum;
          ox = oxy[f2][0];
          oy = oxy[f3][1];
        }
      }
    }
    printf("%lld\n", osum);
    printf("%lld %lld\n", ox, oy);
  }
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6336
final_rank: 5