You need to use an array to record the location of the book numbered I and the number of the book at location I.
Code:
1 # include <cstdio> 2 # include <EXT/pb_ds/assoc_container.hpp> 3 # include <EXT/pb_ds/tree_policy.hpp> 4 using namespace STD; 5 using namespace _ gnu_cxx; 6 using namespace _ gnu_pbds; 7 tree <int, null_type, less <int>, rb_tree_tag, struct> T; 8 typedef tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>: iterator ITER; 9 // change null_type to null_mapped_type10 int POS [100001], Val [500001], A, X, n, m; 11 char op [7]; 12 INT main () 13 {14 scanf ("% d", & N, & M); 15 for (INT I = 1; I <= N; I ++) 16 {17 scanf ("% d", & Val [I + 100000]); 18 POS [Val [I + 100000] = I + 100000; 19 T. insert (I + 100000); 20} 21 for (INT I = 1; I <= m; I ++) 22 {23 scanf ("% s", OP ); 24 if (OP [0] = 'T') 25 {26 scanf ("% d", & A); 27 int TMP = * t. find_by_order (0); 28 t. erase (T. lower_bound (Pos [a]); 29 POS [a] = tmp-1; 30 Val [tmp-1] = A; 31 T. insert (tmp-1); 32} 33 else if (OP [0] = 'B') 34 {35 scanf ("% d", & ); 36 int TMP = * t. find_by_order (n-1); 37 T. erase (T. lower_bound (Pos [a]); 38 POS [a] = TMP + 1; 39 Val [TMP + 1] = A; 40 t. insert (TMP + 1); 41} 42 else if (OP [0] = 'I') 43 {44 scanf ("% d", &, & X); 45 if (x = 0) 46 continue; 47 ITER it = T. lower_bound (Pos [a]); 48 ITER it_beside = it; 49 If (x = 1) 50 it_beside ++; 51 else52 it_beside --; 53 swap (Val [* It], Val [* it_beside]); 54 swap (Pos [Val [* It], POS [Val [* it_beside]); 55} 56 else if (OP [0] = 'A') 57 {58 scanf ("% d", & A); 59 printf ("% d \ n ", t. order_of_key (Pos [a]); 60} 61 else62 {63 scanf ("% d", & A); 64 printf ("% d \ n ", val [* t. find_by_order (A-1)]); 65} 66} 67 return 0; 68}
[Balance Tree] [pb_ds] bzoj1861 [zjoi2006] Book bookshelf