//a1042
//注意下标越界
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
char c[5] = {'S', 'H', 'C', 'D', 'J'};
int begin[55], finish[55], nowIndex[55];
for (int i = 1; i <= 54; i++) {
nowIndex[i] = i;
}
int k;
scanf("%d", &k);
//录入数据
for (int i = 1; i <= 54; i++)
scanf("%d", &begin[i]);
//处理数据
for (int i = 0; i < k; i++) {
for (int j = 1; j <= 54; j++) {
finish[begin[j]] = nowIndex[j];
}
for (int j = 1; j <= 54; j++)
nowIndex[j] = finish[j];
}
//打印数据
for (int i = 1; i <= 54; i++) {
if (i != 1)
printf(" ");
nowIndex[i]--;
printf("%c%d", c[nowIndex[i] / 13], nowIndex[i] % 13 + 1);
}
return 0;
}
//A1065
//注意推导距离
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int N;
scanf("%d", &N);
//存储N个距离
int dis[100010];
//dis[1] 是第一个结点到第二个结点的距离
//dis[2] 是第一个结点到第三个结点的距离
int sumDis = 0;
int keepDis[100010];
for (int i = 1; i <= N; i++) {
scanf("%d", &dis[i]);
sumDis += dis[i];
keepDis[i] = sumDis;
}
int M;
scanf("%d", &M);
int firstNode, secondNode;
for (int i = 0; i < M; i++) {
// 2 5
//dis[4] 第一个结点到第五个结点的距离
//dis[1] 第一个结点到第二个结点的距离
scanf("%d%d", &firstNode, &secondNode);
int tempDis;
if (firstNode < secondNode)
tempDis = keepDis[secondNode - 1] - keepDis[firstNode - 1];
else {
swap(firstNode, secondNode);
tempDis = keepDis[secondNode - 1] - keepDis[firstNode - 1];
}
printf("%d\n", min(sumDis - tempDis, tempDis));
}
return 0;
}