// e[i]表示节点i的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;
// 初始化
void init()
{
// 0表示左端点,1表示右端点
// 初始状态时 左端点指向右端点, 右端点指向左端点
r[0] = 1, l[1] = 0;
idx = 2; // 初始状态有2个结点
}
// 在节点a的右边插入一个数x
void insert(int a, int x) // 在结点a左边插入一个数:insert( l[a],x );
{
e[idx] = x;
l[idx] = a, r[idx] = r[a];
l[r[a]] = idx, r[a] = idx++ ;
}
//在左端点添加结点:insert(0, x);
//在右端点添加结点:insert(l[1],x);
// 删除节点a
void remove(int a)
{
l[r[a]] = l[a];
r[l[a]] = r[a];
}
// 向右端点添加结点
void add_to_right( int x ) {
e[idx] = x;
r[idx] = 1, l[idx] = l[1];
r[l[1]] = idx, l[1] = idx;
idx++;
}
// 向左端点添加结点
void add_to_left( int x ) {
e[idx] = x;
l[idx] = 0, r[idx] = r[0];
l[r[0]] = idx, r[0] = idx;
idx++;
}
// 双链表的遍历,1表示右端点
for(int i = r[0]; i != 1; i = r[i] )