1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 300010 4 using namespace std; 5 struct SplayTree { 6 int root, size; 7 int next[MAXN][2], key[MAXN], pre[MAXN], num[MAXN]; 8 bool flip[MAXN], space; 9 inline void PushUp(int x) { 10 num[x] = num[next[x][0]] + num[next[x][1]] + 1; 11 } 12 void NewNode(int &x, int father, int val) { 13 x = ++size; 14 next[x][0] = next[x][1] = 0; 15 pre[x] = father; 16 key[x] = val; 17 num[x] = 1; 18 flip[x] = false; 19 } 20 void Build(int &x, int L, int R, int father) { 21 if (L <= R) { 22 int mid = (L + R) >> 1; 23 NewNode(x, father, mid); 24 Build(next[x][0], L, mid - 1, x); 25 Build(next[x][1], mid + 1, R, x); 26 PushUp(x); 27 } 28 } 29 void Init(int n) { 30 root = size = 0; 31 next[0][0] = next[0][1] = key[0] = pre[0] = num[0] = 0; 32 flip[0] = space = false; 33 NewNode(root, 0, -1); 34 NewNode(next[root][1], root, -1); 35 num[root]++; 36 Build(next[next[root][1]][0], 1, n, next[root][1]); 37 PushUp(next[root][1]); 38 PushUp(root); 39 } 40 inline void PushDown(int x) { 41 if (flip[x]) { 42 flip[x] = false; 43 flip[next[x][0]] ^= true; 44 flip[next[x][1]] ^= true; 45 swap(next[x][0], next[x][1]); 46 } 47 } 48 void Rotate(int x, int kind) { 49 int y, z; 50 y = pre[x]; 51 z = pre[y]; 52 PushDown(y); 53 next[y][!kind] = next[x][kind]; 54 pre[next[x][kind]] = y; 55 next[z][next[z][1] == y] = x; 56 pre[x] = z; 57 next[x][kind] = y; 58 pre[y] = x; 59 PushUp(y); 60 } 61 void Splay(int x, int goal) { 62 if (x != goal) { 63 PushDown(x); 64 while (pre[x] != goal) { 65 if (next[pre[x]][0] == x) 66 Rotate(x, 1); 67 else 68 Rotate(x, 0); 69 } 70 PushUp(x); 71 if (!goal) 72 root = x; 73 } 74 } 75 int Select(int k) { 76 int x; 77 PushDown(root); 78 for (x = root; num[next[x][0]] + 1 != k;) { 79 if (num[next[x][0]] + 1 > k) 80 x = next[x][0]; 81 else { 82 k -= num[next[x][0]] + 1; 83 x = next[x][1]; 84 } 85 PushDown(x); 86 } 87 return x; 88 } 89 int GetMin(int x) { 90 PushDown(x); 91 while (next[x][0]) { 92 x = next[x][0]; 93 PushDown(x); 94 } 95 return x; 96 } 97 void Cut(int a, int b, int c) { 98 int tmp, d; 99 a = Select(a); 100 b = Select(b + 2); 101 Splay(a, 0); 102 Splay(b, a); 103 tmp = next[b][0]; 104 next[b][0] = 0; 105 PushUp(b); 106 PushUp(a); 107 c = Select(c + 1); 108 Splay(c, 0); 109 d = GetMin(next[c][1]); 110 Splay(d, c); 111 next[d][0] = tmp; 112 pre[tmp] = d; 113 PushUp(d); 114 PushUp(c); 115 } 116 void Flip(int a, int b) { 117 a = Select(a); 118 b = Select(b + 2); 119 Splay(a, 0); 120 Splay(b, a); 121 flip[next[b][0]] ^= true; 122 } 123 void InOrder(int x) { 124 if (x) { 125 PushDown(x); 126 InOrder(next[x][0]); 127 if (key[x] > 0) { 128 if (space) 129 putchar(' '); 130 else 131 space = true; 132 printf("%d", key[x]); 133 } 134 InOrder(next[x][1]); 135 } 136 } 137 } tree; 138 int main() { 139 char cmd[6]; 140 int n, q; 141 int a, b, c; 142 while (scanf("%d%d", &n, &q), n > 0) { 143 tree.Init(n); 144 while (q--) { 145 scanf(" %s%d%d", cmd, &a, &b); 146 if (cmd[0] == 'C') { 147 scanf("%d", &c); 148 tree.Cut(a, b, c); 149 } else 150 tree.Flip(a, b); 151 } 152 tree.InOrder(tree.root); 153 putchar('\n'); 154 } 155 return 0; 156 }