1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # O(n(log(n))^2) solution for http://opc.iarcs.org.in/index.php/problems/FINDPERM # Binary Indexed Tree (by Peter Fenwick) # http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees class FenwickTree # Initialize array 1..n with 0s def initialize(n) @n = n @m = [0] * (n + 1) end # Add value v to cell i def add(i, v) while i <= @n @m[i] += v i += i & -i end end # Get sum on 1..i def sum(i) s = 0 while i > 0 s += @m[i] i -= i & -i end s end # Array size def n return @n end end # Classical binary search # http://en.wikipedia.org/wiki/Binary_search_algorithm class BinarySearch # Find lower index i such that ft.sum(i) == s def self.lower_bound(ft, s) l, r = 1, ft.n while l < r c = (l + r) / 2 if ft.sum(c) < s l = c + 1 else r = c end end l end end # Read input data n = gets.to_i q = gets.split.map &:to_i # Initialize Fenwick tree ft = FenwickTree.new(n) 1.upto(n) do |i| ft.add i, 1 end # Find the answer ans = [0] * n (n - 1).downto(0) do |i| k = BinarySearch.lower_bound(ft, q[i] + 1) ans[n - k] = i + 1 ft.add k, -1 end puts ans.join(' ') |
IyBPKG4obG9nKG4pKV4yKSBzb2x1dGlvbiBmb3IgaHR0cDovL29wYy5pYXJjcy5vcmcuaW4vaW5kZXgucGhwL3Byb2JsZW1zL0ZJTkRQRVJNCgojIEJpbmFyeSBJbmRleGVkIFRyZWUgKGJ5IFBldGVyIEZlbndpY2spCiMgaHR0cDovL2NvbW11bml0eS50b3Bjb2Rlci5jb20vdGM/bW9kdWxlPVN0YXRpYyZkMT10dXRvcmlhbHMmZDI9YmluYXJ5SW5kZXhlZFRyZWVzCmNsYXNzIEZlbndpY2tUcmVlCiAgCiAgIyBJbml0aWFsaXplIGFycmF5IDEuLm4gd2l0aCAwcwogIGRlZiBpbml0aWFsaXplKG4pCiAgICBAbiA9IG4KICAgIEBtID0gWzBdICogKG4gKyAxKQogIGVuZAogIAogICMgQWRkIHZhbHVlIHYgdG8gY2VsbCBpCiAgZGVmIGFkZChpLCB2KQogICAgd2hpbGUgaSA8PSBAbgogICAgICBAbVtpXSArPSB2CiAgICAgIGkgKz0gaSAmIC1pCiAgICBlbmQKICBlbmQKICAKICAjIEdldCBzdW0gb24gMS4uaQogIGRlZiBzdW0oaSkKICAgIHMgPSAwCiAgICB3aGlsZSBpID4gMAogICAgICBzICs9IEBtW2ldCiAgICAgIGkgLT0gaSAmIC1pCiAgICBlbmQKICAgIHMKICBlbmQKICAKICAjIEFycmF5IHNpemUKICBkZWYgbgogICAgcmV0dXJuIEBuCiAgZW5kCiAgCmVuZAoKIyBDbGFzc2ljYWwgYmluYXJ5IHNlYXJjaAojIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0KY2xhc3MgQmluYXJ5U2VhcmNoCgogICMgRmluZCBsb3dlciBpbmRleCBpIHN1Y2ggdGhhdCBmdC5zdW0oaSkgPT0gcwogIGRlZiBzZWxmLmxvd2VyX2JvdW5kKGZ0LCBzKQogICAgbCwgciA9IDEsIGZ0Lm4KICAgIHdoaWxlIGwgPCByCiAgICAgIGMgPSAobCArIHIpIC8gMgogICAgICBpZiBmdC5zdW0oYykgPCBzCiAgICAgICAgbCA9IGMgKyAxCiAgICAgIGVsc2UKICAgICAgICByID0gYwogICAgICBlbmQKICAgIGVuZAogICAgbAogIGVuZAogIAplbmQKCiMgUmVhZCBpbnB1dCBkYXRhCm4gPSBnZXRzLnRvX2kKcSA9IGdldHMuc3BsaXQubWFwICY6dG9faQoKIyBJbml0aWFsaXplIEZlbndpY2sgdHJlZQpmdCA9IEZlbndpY2tUcmVlLm5ldyhuKQoxLnVwdG8obikgZG8gfGl8CiAgZnQuYWRkIGksIDEKZW5kCgojIEZpbmQgdGhlIGFuc3dlcgphbnMgPSBbMF0gKiBuCihuIC0gMSkuZG93bnRvKDApIGRvIHxpfAogIGsgPSBCaW5hcnlTZWFyY2gubG93ZXJfYm91bmQoZnQsIHFbaV0gKyAxKQogIGFuc1tuIC0ga10gPSBpICsgMQogIGZ0LmFkZCBrLCAtMQplbmQKcHV0cyBhbnMuam9pbignICcpCgo=
-
upload with new input
-
result: Success time: 0s memory: 4760 kB returned value: 0
8 0 1 0 2 2 1 2 0
2 4 5 1 7 6 3 8


