// Treap 7.30 # include <stdio. h> # include <stdlib. h> # define Mmm 1000000 struct SS {int left, right, key, Data, Count, size;} t [Mmm + 1]; int n, x, y, TOT, tott, root; int B [Mmm + 1]; void modify (INT X) {T [X]. size = T [T [X]. left]. size + T [X]. count + T [T [X]. right]. size;} void leftrotate (int * X) {int TE = T [* X]. left; t [* X]. left = T [Te]. right; t [Te]. right = * X; Modify (* X); * x = tE; Modify (* X);} void rightrotate (int * X) {int TE = T [* X]. right; t [* X]. right = T [Te]. left; t [Te]. left = * X; Modify (* X); * x = tE; Modify (* X);} void insert (int * X, int y) {If (* x = 0) {* x = ++ tot; t [* X]. left = 0; t [* X]. right = 0; t [* X]. size = 1; t [* X]. count = 1; t [* X]. key = rand () % mmm; t [* X]. data = y;} else {If (y = T [* X]. data) ++ T [* X]. count; else if (Y <t [* X]. data) {insert (& T [* X]. left, Y); If (T [T [* X]. left]. key <t [* X]. key) leftrotate (x);} else {insert (& T [* X]. right, Y); If (T [T [* X]. rig HT]. key <t [* X]. key) rightrotate (x);} modify (* X) ;}} void Delete _ (int * X, int y) {If (* x = 0) return; if (Y <t [* X]. data) delete _ (& T [* X]. left, Y); else if (Y> T [* X]. data) delete _ (& T [* X]. right, Y); else {If (T [* X]. count> 1) -- t [* X]. count; else if (T [* X]. left = 0) * x = T [* X]. right; else if (T [* X]. right = 0) * x = T [* X]. left; else if (T [T [* X]. left]. key <t [T [* X]. right]. key) {leftrotate (x); Delete _ (& T [* X]. right, Y );} Else {rightrotate (x); Delete _ (& T [* X]. Left, Y) ;}} if (* X! = 0) Modify (* X);} int findkth (int x, int y) {If (Y <= T [T [X]. left]. size) return findkth (T [X]. left, Y); else if (Y <= T [T [X]. left]. size + T [X]. count) return T [X]. data; else return findkth (T [X]. right, Y-T [T [X]. left]. size-T [X]. count);} int main () {freopen ("Shop. in "," r ", stdin); freopen (" Shop. out "," W ", stdout); scanf (" % d ", & N); srand (n); For (INT I = 1; I <= N; ++ I) {scanf ("% d", & X, & Y); If (x = 1) {insert (& root, y ); B [++ tott] = y;} else if (x = 2) printf ("% d \ n", B [y]); else printf ("% d \ n", findkth (root, y);} // while (1); Return 0 ;}