public IEnumerable <string> Solve(int n, int[][] queries) { var treap = new ImplicitTreap(n); for (int i = 1; i <= n; i++) { treap.Add(i); } foreach (var query in queries) { if (query[0] == 1) { var start = query[1] - 1; var end = query[2] - 1; treap.Reverse(start, end); reverseCnt++; } if (query[0] == 2) { var elem = query[1]; var pos = GetIdx(treap, elem, reverseCnt) + 1; yield return($"element {elem} is at position {pos}"); } if (query[0] == 3) { var pos = query[1] - 1; var elem = treap[pos]; yield return($"element at position {pos} is {elem}"); } } }
public List <int> Solve(IEnumerable <int> a, int[][] queries) { var treap = new ImplicitTreap(a.Count()); foreach (var it in a) { treap.Add(it); } foreach (var query in queries) { var l = query[1] - 1; var r = query[2] - 1; TreapNode p1 = null, p2 = null, p3 = null; Split(treap.Root, r + 1, ref p2, ref p3); Split(p2, l, ref p1, ref p2); if (query[0] == 1) { treap.Root = Merge(p2, Merge(p1, p3)); } else { treap.Root = Merge(p1, Merge(p3, p2)); } } return(treap.ToList()); }
public static int GetIdx(ImplicitTreap treap, int elem, int revCnt) { //todo : improve this, introduce caching. long idx = elem - 1; for (int i = 0; i < revCnt; i++) { idx = treap[(int)idx] - 1; } return((int)idx); }
public static IEnumerable <long> Solve(int[] a, IEnumerable <int[]> queries) { var treapCount = 2; var treaps = new ImplicitTreap[treapCount]; for (int i = 0; i < treapCount; i++) { treaps[i] = new ImplicitTreap(100000); } for (int i = 0; i < a.Length; i++) { treaps[i % treapCount].Add(a[i]); } foreach (var query in queries) { var l = query[1] - 1; var r = query[2] - 1; var t = query[0]; var ql = new int[treapCount]; var qr = new int[treapCount]; for (int i = 0; i < treapCount; i++) { if (l == r && l % 2 != i) { ql[i] = 0; qr[i] = -1; } else { ql[i] = (l % 2 == i) ? l / 2 : (l + 1) / 2; qr[i] = (r % 2 == i) ? r / 2 : (r - 1) / 2; } } if (t == 1) { TSwap(ref treaps[0], ql[0], qr[0], ref treaps[1], ql[1], qr[1]); } else { long ans = 0; for (int i = 0; i < treapCount; i++) { if (ql[i] <= qr[i]) { ans += treaps[i].Sum(ql[i], qr[i]); } } yield return(ans); } } }
public void Revert_and_Idx_Test() { for (int i = 0; i < 1000; i++) { var treap = new ImplicitTreap(4) { 0, 1, 2 }; treap.Reverse(0, 2); Assert.Equal(2, treap.GetIdx(treap.Nodes.First())); } }
public static void TSwap(ref ImplicitTreap t1, int l1, int r1, ref ImplicitTreap t2, int l2, int r2) { TreapNode p1 = null, p2 = null, p3 = null, q1 = null, q2 = null, q3 = null; Split(t1.Root, r1 + 1, ref p2, ref p3); Split(p2, l1, ref p1, ref p2); Split(t2.Root, r2 + 1, ref q2, ref q3); Split(q2, l2, ref q1, ref q2); t1.Root = Merge(p1, Merge(q2, p3)); t2.Root = Merge(q1, Merge(p2, q3)); }
public void CrazyHelix_GetIdx_Test() { int n = 500; var treap = new ImplicitTreap(n); for (int i = 1; i <= n; i++) { treap.Add(i); } var dic = treap.Nodes.ToDictionary(n => n.Value); for (int i = 1; i <= n; i++) { Assert.Equal(i - 1, treap.GetIdx(dic[i])); } }
public void CrazyHelix_Test0() { for (int i = 0; i < 1000; i++) { var treap = new ImplicitTreap(5) { 1, 2, 3, 4, 5 }; var dic = treap.Nodes.ToDictionary(n => n.Value); treap.Reverse(0, 2); //var x = treap[0]; if (treap.GetIdx(dic[3]) != 0) { } Assert.Equal(0, treap.GetIdx(dic[3])); } }
public void CrazyHelix_Test() { var treap = new ImplicitTreap(5) { 1, 2, 3, 4, 5 }; treap.Reverse(2, 4); var dic = treap.Nodes.ToDictionary(n => n.Value); Assert.Equal(0, treap.GetIdx(dic[1])); Assert.Equal(3, treap.GetIdx(dic[4])); Assert.Equal(2, treap.GetIdx(dic[5])); Assert.Equal(1, treap.GetIdx(dic[2])); Assert.Equal(4, treap.GetIdx(dic[3])); treap.Reverse(1, 3); Assert.Equal(0, treap.GetIdx(dic[1])); Assert.Equal(1, treap.GetIdx(dic[4])); Assert.Equal(2, treap.GetIdx(dic[5])); Assert.Equal(3, treap.GetIdx(dic[2])); Assert.Equal(4, treap.GetIdx(dic[3])); }