#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    // Tối ưu I/O
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    long long H, W, N;
    if (!(cin >> H >> W >> N)) return 0;

    vector<pair<long long, long long>> doors(N);
    for (int i = 0; i < N; ++i) {
        cin >> doors[i].first >> doors[i].second;
    }
    
    // Sắp xếp các cửa theo hàng (row), sau đó theo cột (col)
    sort(doors.begin(), doors.end());

    long long opt1_cost = 0;
    long long sum_creturn = 0;
    vector<long long> deltas;

    vector<long long> X;
    for (int i = 0; i < N; ++i) {
        X.push_back(doors[i].second);
        
        // Kích hoạt xử lý khi đã gom đủ các cột của một hàng
        if (i == N - 1 || doors[i].first != doors[i+1].first) {
            sort(X.begin(), X.end());
            X.erase(unique(X.begin(), X.end()), X.end());

            // Chiến lược 1: Chỉ tiếp cận từ cột 1 (không bao giờ sang cột W)
            opt1_cost += 2LL * (X.back() - 1);

            // Chiến lược 2: Chia cắt khoảng cách lớn nhất, tiếp cận từ cả cột 1 và cột W
            long long max_gap = max(X.front() - 1, W - X.back());
            for (size_t j = 0; j < X.size() - 1; ++j) {
                max_gap = max(max_gap, X[j+1] - X[j]);
            }

            long long c_ret = 2LL * (W - 1 - max_gap);
            sum_creturn += c_ret;
            
            // Lượng chi phí thay đổi nếu quyết định đi xuyên qua hàng này (từ 1 -> W hoặc W -> 1)
            deltas.push_back((W - 1) - c_ret);

            X.clear();
        }
    }

    // Luôn có sẵn vô hạn hàng rỗng để đi xuyên qua với chi phí W - 1 (cần tối đa 2 hàng để cân bằng tính chẵn lẻ)
    deltas.push_back(W - 1);
    deltas.push_back(W - 1);
    
    sort(deltas.begin(), deltas.end());

    long long S_neg = 0;
    int K = 0;
    for (long long d : deltas) {
        if (d < 0) {
            S_neg += d;
            K++;
        }
    }

    long long opt2_cost = 0;
    // Bắt buộc số lần đi xuyên qua các hàng (từ cột này sang cột kia) phải là số chẵn và >= 2 để có thể sử dụng cột W
    if (K % 2 == 1) {
        if (K > 1) {
            opt2_cost = sum_creturn + S_neg + min(-deltas[K-1], deltas[K]);
        } else {
            opt2_cost = sum_creturn + S_neg + deltas[1];
        }
    } else {
        if (K >= 2) {
            opt2_cost = sum_creturn + S_neg;
        } else {
            opt2_cost = sum_creturn + deltas[0] + deltas[1];
        }
    }

    // Kết quả cuối cùng là giá trị tối ưu giữa việc không bao giờ dùng thang máy cột W và có dùng thang máy cột W
    cout << min(opt1_cost, opt2_cost) << "\n";

    return 0;
}