【POJ】3481 Double Queue

 1 #include<cstdio>

 2 #define MAXN 100010

 3 struct SplayTree {

 4     int size, root;

 5     int next[MAXN][2], pre[MAXN], key[MAXN], pos[MAXN];

 6     void Init() {

 7         size = root = 0;

 8         next[0][0] = next[0][1] = 0;

 9     }

10     void NewNode(int &rt, int father, int val, int id) {

11         rt = ++size;

12         next[rt][0] = next[rt][1] = 0;

13         pre[rt] = father;

14         key[rt] = val;

15         pos[rt] = id;

16     }

17     void Rotate(int x, int kind) {

18         int y = pre[x];

19         next[y][!kind] = next[x][kind];

20         pre[next[x][kind]] = y;

21         pre[x] = pre[y];

22         if (pre[y])

23             next[pre[y]][next[pre[y]][1] == y] = x;

24         next[x][kind] = y;

25         pre[y] = x;

26     }

27     void Splay(int x, int goal) {

28         while (pre[x] != goal) {

29             if (next[pre[x]][0] == x)

30                 Rotate(x, 1);

31             else

32                 Rotate(x, 0);

33         }

34         if (!goal)

35             root = x;

36     }

37     void Insert(int val, int id) {

38         int x;

39         for (x = root; next[x][key[x] < val]; x = next[x][key[x] < val])

40             ;

41         NewNode(next[x][key[x] < val], x, val, id);

42         Splay(next[x][key[x] < val], 0);

43     }

44     void Delete(int x) {

45         if (x == root) {

46             if (!next[x][0] && !next[x][1])

47                 Init();

48             else {

49                 int t = next[x][0] ? 0 : 1;

50                 pre[next[x][t]] = 0;

51                 root = next[x][t];

52             }

53         } else {

54             int y, t;

55             y = pre[x];

56             t = (next[y][1] == x);

57             next[y][t] = next[x][!t];

58             pre[next[x][!t]] = y;

59             Splay(y, 0);

60         }

61     }

62     void Lowest() {

63         int x = root;

64         if (x) {

65             for (; next[x][0]; x = next[x][0])

66                 ;

67             printf("%d\n", pos[x]);

68             Delete(x);

69         } else

70             puts("0");

71     }

72     void Highest() {

73         int x = root;

74         if (x) {

75             for (; next[x][1]; x = next[x][1])

76                 ;

77             printf("%d\n", pos[x]);

78             Delete(x);

79         } else

80             puts("0");

81     }

82 } tree;

83 int main() {

84     int cmd, val, id;

85     tree.Init();

86     while (scanf("%d", &cmd), cmd) {

87         if (cmd == 1) {

88             scanf("%d%d", &id, &val);

89             tree.Insert(val, id);

90         } else if (cmd == 2)

91             tree.Highest();

92         else

93             tree.Lowest();

94     }

95     return 0;

96 }

你可能感兴趣的:(double)