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));
                    }
                }
            }
        }
Beispiel #2
0
    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);
            }
        }