fork download
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. class Main{
  5. public static void main(String args[]) throws Exception{
  6. int N = Integer.parseInt(br.readLine());
  7. AVLTree tree = new AVLTree();
  8. for(int i=0; i<N; i++){
  9. int m = Integer.parseInt(br.readLine());
  10. tree.insert(m);
  11. int r = tree.greaterThan(m)+1;
  12. System.out.println(r);
  13. }
  14. }
  15. }
  16.  
  17. class AVLTree{
  18. static class Node{
  19. int key, height, size;
  20. Node left, right;
  21.  
  22. Node(int k){
  23. key = k;
  24. height = size = 1;
  25. }
  26.  
  27. void update(){
  28. height = Math.max(getHeight(left), getHeight(right)) + 1;
  29. size = getSize(left) + getSize(right) + 1;
  30. }
  31.  
  32. static int getHeight(Node n){
  33. return n==null?0:n.height;
  34. }
  35.  
  36. static int getSize(Node n){
  37. return n==null?0:n.size;
  38. }
  39. }
  40.  
  41. Node root;
  42.  
  43. Node rotateRight(Node p){
  44. Node c = p.left;
  45. Node g = c.right;
  46. p.left = g;
  47. c.right = p;
  48. p.update();
  49. c.update();
  50.  
  51. return c;
  52. }
  53.  
  54. Node rotateLeft(Node p){
  55. Node c = p.right;
  56. Node g = c.left;
  57. p.right = g;
  58. c.left = p;
  59. p.update();
  60. c.update();
  61.  
  62. return c;
  63. }
  64.  
  65. Node insert(Node n, int key){
  66.  
  67. if(n==null)
  68. return new Node(key);
  69.  
  70. if(key<n.key)
  71. n.left = insert(n.left, key);
  72. else if(key>n.key)
  73. n.right = insert(n.right, key);
  74. else
  75. return n;
  76. n.update();
  77.  
  78. int bal = Node.getHeight(n.left) - Node.getHeight(n.right);
  79.  
  80. if(bal>1 && key<n.left.key)
  81. return rotateRight(n);
  82. if(bal<-1 && key>n.right.key)
  83. return rotateLeft(n);
  84. if(bal>1 && key>n.left.key){
  85. n.left = rotateLeft(n.left);
  86. return rotateRight(n);
  87. }
  88. if(bal<-1 && key<n.right.key){
  89. n.right = rotateRight(n.right);
  90. return rotateLeft(n);
  91. }
  92.  
  93. return n;
  94. }
  95.  
  96. void insert(int key){
  97. root = insert(root, key);
  98. }
  99.  
  100. int greaterThan(int key){
  101. Node n = root;
  102. int count = 0;
  103. while(n!=null){
  104. if(key<n.key){
  105. count += 1 + Node.getSize(n.right);
  106. n = n.left;
  107. }
  108. else if(key==n.key){
  109. count += Node.getSize(n.right);
  110. break;
  111. }
  112. else
  113. n = n.right;
  114. }
  115. return count;
  116. }
  117. }
Success #stdin #stdout 0.04s 711168KB
stdin
6
78
24
68
40
39
89
stdout
1
2
2
3
4
1