ソ連時代のウクライナはドニプロペトロウシク州クルィヴィーイ・リーフに生まれる。4歳でバレエを始め、10歳のときモスクワのボリショイ・バレエ学校に入学。卒業後の1986年にモスクワ・クラシック・バレエ団に入団し、最も若いプリンシパルとなる。同年にはヴァルナ国際バレエコンクール金賞、1989年モスクワ国際バレエコンクール金メダル受賞。ソ連が崩壊した1991年にロシアを離れ、1992年にウィーン国立歌劇場バレエ団のプリンシパルとなる。1994年にはカナダ国立バレエともプリンシパルとして契約。1995年、メトロポリタン歌劇場でのアメリカン・バレエ・シアター公演を機に、ABTのプリンシパルとなった。その他、プリンシパル・ゲストとして、ウィーン、シュトゥットガルト、ベルリンでも踊っている。2002年、ベルリン国立歌劇場バレエ団の芸術監督に就任。2004年ベルリンの3つの歌劇場の統合により新設されたベルリン国立バレエ団の芸術監督に就任。2007年8月に膝の手術を受けてしばらく舞台を離れるが、2008年1月に舞台に復帰した。2013-14年シーズンをもって退任後、2014年8月より東京バレエ団のアーティスティックアドバイザーに就任した。レパートリーも幅広く、『白鳥の湖』、『ジゼル』、『ロメオとジュリエット』、『ナルシス』（ゴレイゾフスキー振付）、『ヴォヤージュ』（ツァネラ振付）、『レマンゾ』（N・ドゥアト振付）など。振付家としては 『ラ・ペリ」ラ・バヤデール』、『眠れる森の美女』、『シンデレラ』 （2004年） などの改訂演出作品があり、自らも現役舞踏手として出演している。
先コロンブス期にはマヤ文明が栄え、タスマル遺跡等が残っている。1200年～1400年、レンパ川周辺をピピル人が支配していた。1528年～1540年、スペイン人が征服した。1824年、ソンソナーテ県に組み込まれた。1855年2月8日、サンタ・アナ県が設置された。
マージソートのアルゴリズムについては、当該記事を参照されたい。ここではマージソートを3つの関数 split、merge、MergeSort で実装している。関数 split は、追加の引数を持つ局所関数 split_iter を使って実装している。これは末尾再帰の実装に便利な手法である。この関数はSMLのパターンマッチング構文を使っており、リストが空でないケース ('x::xs') と空のケース ('[]') を定義している。 (* 要素のリストを与えられ、それをほぼ同じサイズの  * 2つに分割する。  * O(n)  *) local  fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left)  |   split_iter ([], left, right) = (left, right) in  fun split(x) = split_iter(x,[],[]) end;local-in-end という構文を let-in-end という構文に置き換えると、等価な定義が得られる。 fun split(x) =  let   fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left)   |   split_iter ([], left, right) = (left, right)  in   split_iter(x,[],[])  end;split と同様、merge も局所関数 merge_iter を使って効率化する。merge_iter ではいくつかのケース（渡されたリストがどちらも空でない場合、一方が空の場合、両方が空の場合）を定義している。'_' はワイルドカード・パターンを表している。この関数は2つの昇順のリストを1つの降順のリストにマージする。逆転するのはSMLにおけるリストの構造によるものである。SMLではリストを非平衡2分木で実装しているため、要素を先頭に付与するのは容易だが、最後尾に付与するのは非効率的である。  (* 2つの昇順リストを1つの降順リストにマージする。  * 関数 lt(a,b) は a < b と同値  * O(n)  *) local  fun merge_iter (out, left as (x::xs), right as (y::ys), lt) =      if lt(x, y)       then merge_iter(x::out, xs, right, lt)       else merge_iter(y::out, left, ys, lt)  |   merge_iter (out, x::xs, [], lt) = merge_iter( x::out, xs, [], lt)  |   merge_iter (out, [], y::ys, lt) = merge_iter( y::out, [], ys, lt)  |   merge_iter (out, [], [], _) = out in  fun merge(x,y,lt) = merge_iter([],x,y,lt) end;最後に、MergeSort 関数を以下に示す。 (* リストを降順にソートする。順序は lt(a,b) <==> a < b で決定。  * O(n log n)  *) fun MergeSort(empty as [], _) = empty |   MergeSort(single as _::[], _) = single |   MergeSort(x, lt) =     let      val (left, right) = split(x)      val sl = MergeSort(left, lt)      val sr = MergeSort(right, lt)      val s = merge(sl,sr,lt)     in      rev s     end;なお、見ての通りこのコードでは要素の型を規定していない。そのため、順序関数 lt さえあれば、どんな型の要素でもソートできる。型推論により、コンパイラは lt 関数のような複雑な型も含め、あらゆる変数の型を推論できる。