public void Subsum_Random() { for (int k = 0; k < 10; k++) { for (int n = 0; n < 10; n++) { Test(n); } for (int n = 250; n < 260; n++) { Test(n); } } void Test(int n) { var a = RandomHelper.CreateData(n); var s = new int[n + 1]; var st = new ST_Subsum(n); for (int i = 0; i < n; i++) { s[i + 1] = s[i] + a[i]; st.Add(i, a[i]); } for (int i = 0; i < n; i++) { for (int j = i; j <= n; j++) { Assert.AreEqual(s[j] - s[i], st.Subsum(i, j)); } } } }
static void Main() { var r = new List <long>(); var h = Read(); var n = h[0]; var a = Read(); var st = new ST_Subsum(n); for (int i = 0; i < n; i++) { st.Add(i, a[i]); } for (int i = 0; i < h[1]; i++) { var q = Read(); if (q[0] == 0) { st.Add(q[1], q[2]); } else { r.Add(st.Subsum(q[1], q[2])); } } Console.WriteLine(string.Join("\n", r)); }
public void Inversion_Random() { for (int k = 0; k < 10; k++) { for (int n = 0; n < 10; n++) { Test(n); } for (int n = 250; n < 260; n++) { Test(n); } } void Test(int n) { var a = RandomHelper.ShuffleRange(1, n); var expected = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (a[i] > a[j]) { expected++; } } } var st = new ST_Subsum(n + 1); var r = 0L; for (int i = 0; i < n; i++) { r += st.Subsum(a[i], n + 1); st.Add(a[i], 1); } Assert.AreEqual(expected, r); } }