#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long i64;
typedef vector<int> ivec;
#define MOD 1000000007
int in() { int x; scanf("%d", &x); return x; }
int H, W, N, A[200050], R[200050], S[200050];
struct del {
int a, b;
} D[200050];
int left(int r, int c);
int right(int r, int c) {
r %= (2 * W);
if (c + r < W - 1) {
return c + r + 1;
}
int move = (W - 2) - c;
return left(r - move - 2, W - 2);
}
int left(int r, int c) {
r %= (2 * W);
if (c - r >= 0) {
return c - r;
}
int move = c;
return right(r - move - 2, 0);
}
void doit(int r, int c) {
int L = left(r, c);
int R = right(r, c);
swap(A[L], A[R]);
}
int main()
{
H = in();
W = in();
N = in();
for (int i = 0; i < W; ++i) {
A[i] = i;
}
for (int i = 0; i < N; ++i) {
D[i].a = in() - 1;
D[i].b = in() - 1;
}
sort(D, D + N, [](const del& a, const del& b) {
return a.a < b.a;
});
for (int i = 0; i < N; ++i) {
doit(D[i].a, D[i].b);
}
if (H % 2 == 0) {
R[0] = right(H - 2, 0);
R[W - 1] = left(H - 2, W - 2);
for (int i = 1; i < W - 1; i += 2) {
R[i] = right(H - 1, i);
R[i + 1] = left(H - 1, i);
}
}
else {
for (int i = 0; i < W; i += 2) {
R[i] = right(H - 1, i);
R[i + 1] = left(H - 1, i);
}
}
for (int i = 0; i < W; ++i) {
S[A[R[i]]] = i + 1;
}
for (int i = 0; i < W; ++i) {
printf("%d\n", S[i]);
}
return 0;
}
./Main.cpp: In function ‘int in()’:
./Main.cpp:15:34: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int in() { int x; scanf("%d", &x); return x; }
^