Exemplo n.º 1
0
            public void TestAddSegmentTree2()
            {
                // Arrange
                var st = new SegmentTree(5);

                // Act
                st.Set(4, 0);
                st.Set(3, 1);
                st.Set(2, 2);
                st.Set(1, 1);
                st.Set(0, 2);

                // Assert
                Assert.AreEqual(0, st._data[6]);
                Assert.AreEqual(1, st._data[5]);
                Assert.AreEqual(2, st._data[4]);
                Assert.AreEqual(1, st._data[8]);
                Assert.AreEqual(2, st._data[7]);

                Assert.AreEqual(0, st._data[2]);
                Assert.AreEqual(1, st._data[3]);

                Assert.AreEqual(1, st._data[1]);

                Assert.AreEqual(0, st._data[0]);
            }
Exemplo n.º 2
0
    public static void Main()
    {
        var nm          = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n           = nm[0];
        var m           = nm[1];
        var constraints = Enumerable.Repeat(0, m).Select(_ => Console.ReadLine().Split().Select(int.Parse).ToArray()).Select(x => (l: x[0] - 1, r: x[1] - 1, x: x[2])).ToArray();

        int[]               res     = new int[n];
        SegmentTree <int>   segTree = new SegmentTree <int>(n, 0, (x, y) => x + y);
        PriorityQueue <int> pqueue  = new PriorityQueue <int>(true);
        int nextUpdate = 0;

        foreach (var(l, r, x) in constraints.OrderBy(x => x.r))
        {
            while (nextUpdate <= r)
            {
                pqueue.Push(nextUpdate);
                nextUpdate++;
            }
            var curSum = segTree.Query(l, r);
            while (curSum < x)
            {
                var pos = pqueue.Pop();
                res[pos]++;
                segTree[pos]++;
                curSum++;
            }
        }
        Console.WriteLine(string.Join(" ", res));
    }
Exemplo n.º 3
0
        public IList <int> CountSmaller(int[] nums)
        {
            int[] result = new int[nums.Length];
            SortedDictionary <int, List <int> > dict = new SortedDictionary <int, List <int> >();

            for (int i = 0; i < nums.Length; i++)
            {
                List <int> l;
                if (!dict.TryGetValue(nums[i], out l))
                {
                    dict.Add(nums[i], l = new List <int>());
                }
                l.Add(i);
            }
            SegmentTree tree = new SegmentTree(0, nums.Length - 1);

            foreach (var pair in dict)
            {
                foreach (int pos in pair.Value)
                {
                    result[pos] = tree.CountRange(pos + 1, nums.Length - 1);
                }
                foreach (int pos in pair.Value)
                {
                    tree.Add(pos);
                }
            }
            return(result.ToList());
        }
Exemplo n.º 4
0
    static void Main()
    {
        var nk = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nk[0];
        var k  = nk[1];

        long[] accums = new long[n + 1];
        for (int i = 1; i < accums.Length; i++)
        {
            accums[i] = accums[i - 1] + int.Parse(Console.ReadLine()) - k;
        }
        var list = accums.Distinct().ToList();

        list.Sort();
        SegmentTree <int> segTree = new SegmentTree <int>(list.Count, 0, (x, y) => x + y);
        long res = 0;

        for (int i = 0; i < accums.Length; i++)
        {
            var ind = list.BinarySearch(accums[i]);
            res += segTree.Query(0, ind);
            segTree.Operate(ind, 1);
        }
        Console.WriteLine(res);
    }
Exemplo n.º 5
0
    private void VerifySmall(int empty, Func <int, int, int> append)
    {
        const int Min = -100;
        const int Max = 100;

        var random = new Random();

        for (var count = 1; count < 15; count++)
        {
            var array = Enumerable.Repeat(0, count).Select(_ => random.Next(Min, Max)).ToArray();
            var tree  = SegmentTree.Create(array, empty, append);

            tree.Count.Is(count);
            tree.IsSeq(array);

            Verify(array, tree);

            for (var s = 0; s < 20; s++)
            {
                var i    = random.Next(0, count);
                var item = random.Next(Min, Max);
                tree[i]  = item;
                array[i] = item;

                Verify(array, tree);
            }
        }
    }
Exemplo n.º 6
0
    public void Test_FromSemigroup()
    {
        var tree = SegmentTree.FromSemigroup(new[] { 3, 1, 4, 2, 5 }, (x, y) => x + y);

        tree.Query(1, 3).value.Is(7);
        tree.Query(5, 0).ok.Is(false);
    }
Exemplo n.º 7
0
        static void Method(string[] args)
        {
            int[] nq = ReadInts();
            int   n  = nq[0];
            int   q  = nq[1];

            int[] array = ReadInts();
            var   tree  = new SegmentTree <int>(n, (a, b) => a ^ b, 0, 0);

            for (int i = 0; i < n; i++)
            {
                tree.Update(i, array[i]);
            }

            for (int i = 0; i < q; i++)
            {
                int[] txy = ReadInts();
                int   t   = txy[0];
                int   x   = txy[1];
                int   y   = txy[2];
                if (t == 1)
                {
                    int now = tree.Look(x - 1);
                    tree.Update(x - 1, now ^ y);
                }
                else
                {
                    WriteLine(tree.Scan(x - 1, y - 1));
                }
            }
        }
Exemplo n.º 8
0
    public static long Solve(long[] a)
    {
        var seq1 = new List <long>();

        for (int i = 0; i < a.Length - 1; i++)
        {
            seq1.Add(Abs(a[i + 1] - a[i]) * (i % 2 == 0 ? 1 : -1));
        }
        var accum = new List <long>()
        {
            0
        };

        foreach (var item in seq1)
        {
            accum.Add(accum.Last() + item);
        }
        SegmentTree <long> segTree = new SegmentTree <long>(accum.ToArray(), long.MinValue / 2, Max);
        var res = long.MinValue;

        for (int i = 0; i < segTree.Size; i += 2)
        {
            res = Max(res, segTree.Query(i + 1, segTree.Size - 1) - segTree[i]);
        }
        return(res);
    }
Exemplo n.º 9
0
    public static void Main()
    {
        var nk = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nk[0];
        var k  = nk[1];
        var a  = Console.ReadLine().Split().Select(int.Parse).ToArray();

        //var a = Enumerable.Repeat(0, n).ToArray();
        //nが小さい時注意
        for (int count = 0; count < k; count++)
        {
            SegmentTree <int> next = new SegmentTree <int>(n, 0, (x, y) => x + y);
            for (int i = 0; i < n; i++)
            {
                next.Operate(Max(i - a[i], 0), Min(i + a[i], n - 1), 1);
            }
            var isAllN = true;
            for (int i = 0; i < n; i++)
            {
                a[i] = next[i];
                if (a[i] != n)
                {
                    isAllN = false;
                }
            }
            if (isAllN)
            {
                break;
            }
            //Console.WriteLine(string.Join(" ", a));
        }

        Console.WriteLine(string.Join(" ", a));
    }
        static void SegmentTreeTest()
        {
            int[]             A = { 8, 7, 3, 9, 5, 1, 10 };
            SegmentTree <int> t = new SegmentTree <int>(A.Length);

            t.buildTree(A);
            Console.WriteLine("{0} ", t.get(0, 1));
            Console.WriteLine("{0} ", t.get(1, 1));
            Console.WriteLine("{0} ", t.get(1, 2));
            Console.WriteLine("{0} ", t.get(1, 3));
            Console.WriteLine("{0} ", t.get(0, 3));
            Console.WriteLine("{0} ", t.get(3, 3));
            Console.WriteLine();
            t.set(11, 2, 2);
            Console.WriteLine("{0} ", t.get(0, 1));
            Console.WriteLine("{0} ", t.get(1, 1));
            Console.WriteLine("{0} ", t.get(1, 2));
            Console.WriteLine("{0} ", t.get(1, 3));
            Console.WriteLine("{0} ", t.get(0, 3));
            Console.WriteLine("{0} ", t.get(3, 3));
            Console.WriteLine();
            t.set(33, 1, 2);
            Console.WriteLine("{0} ", t.get(0, 1));
            Console.WriteLine("{0} ", t.get(1, 1));
            Console.WriteLine("{0} ", t.get(1, 2));
            Console.WriteLine("{0} ", t.get(1, 3));
            Console.WriteLine("{0} ", t.get(0, 3));
            Console.WriteLine("{0} ", t.get(3, 3));
            Console.WriteLine();
        }
Exemplo n.º 11
0
        private static void Main(string[] args)
        {
            var input = File.ReadAllLines(InputFileName);
            var size  = int.Parse(input[0]);
            var tree  = new SegmentTree(500000 + 1);
            var ranks = new int[size];

            foreach (var line in input.Skip(1))
            {
                var coords = line.Split().Select(int.Parse).ToArray();
                var(x, y) = (coords[0], coords[1]);

                var rank = tree.SumRange(0, x + 1);

                ranks[rank]++;

                var count = tree.Get(x);

                tree.Update(x, count + 1);
            }

            var output = string.Join("\n", ranks);

            File.WriteAllText(OutputFileName, output);
        }
Exemplo n.º 12
0
    public static void Main()
    {
        var nm = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nm[0];
        var m  = nm[1];
        var a  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        SegmentTree <int> segTree = new SegmentTree <int>(Enumerable.Range(0, n + 1).ToArray(), int.MaxValue, Min);

        int[] cnt = new int[n];
        for (int i = 0; i < m; i++)
        {
            cnt[a[i]]++;
            segTree[a[i]] = int.MaxValue;
        }
        var res = int.MaxValue;

        for (int i = 0; i <= n - m; i++)
        {
            res = Min(res, segTree.Query(0, n));

            cnt[a[i]]--;
            if (cnt[a[i]] == 0)
            {
                segTree[a[i]] = a[i];
            }

            if (i == n - m)
            {
                break;
            }
            cnt[a[i + m]]++;
            segTree[a[i + m]] = int.MaxValue;
        }
        Console.WriteLine(res);
    }
Exemplo n.º 13
0
    public static void Main()
    {
        var nm                       = Console.ReadLine().Split().Select(long.Parse).ToArray();
        var m                        = nm[1];
        var queries                  = Enumerable.Repeat(0, (int)m).Select(_ => Query.Parse(Console.ReadLine())).ToArray();
        var compressDict             = queries.Select(x => x.N).Distinct().OrderBy(x => x).Select((Elem, Index) => new { Elem, Index }).ToDictionary(x => x.Elem, x => x.Index);
        SegmentTree <Linear> segTree = new SegmentTree <Linear>(compressDict.Count, new Linear()
        {
            A = 1, B = 0
        }, Linear.Merge);

        double min = 1;
        double max = 1;

        foreach (var query in queries)
        {
            segTree[compressDict[query.N]] = new Linear()
            {
                A = query.A, B = query.B
            };
            var res = segTree.Query(0, compressDict.Count - 1);
            max = Max(max, res.A + res.B);
            min = Min(min, res.A + res.B);
        }
        Console.WriteLine(min);
        Console.WriteLine(max);
    }
Exemplo n.º 14
0
    static bool Solve(int maxA, int maxB, Section[] a, Section[] b)
    {
        List <int>[] events = Enumerable.Range(0, maxA + 1).Select(_ => new List <int>()).ToArray();
        for (int i = 0; i < a.Length; i++)
        {
            events[a[i].Begin].Add(i + 1);
            events[a[i].End + 1].Add(-(i + 1));
        }
        SegmentTree <int, int> segTree = new SegmentTree <int, int>(maxB, 0, 0, Max, (x, y) => x + y, (x, y) => x + y);
        int count = 0;

        for (int i = 0; i < events.Length; i++)
        {
            foreach (var @event in events[i])
            {
                var target = Abs(@event) - 1;
                var sign   = Sign(@event);
                var bElem  = b[target];
                count += sign;
                segTree.Update(bElem.Begin, bElem.End, sign);
            }
            var queryRes = segTree.Query(0, maxB - 1);
            if (queryRes != count)
            {
                return(false);
            }
        }
        return(true);
    }
Exemplo n.º 15
0
    public static void Main()
    {
        var nq = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var a  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        //クエリ先読み昇順ソート
        SegmentTree <long> rsq   = new SegmentTree <long>(nq[0], 0, (x, y) => x + y);
        SegmentTree <long> rcq   = new SegmentTree <long>(nq[0], 0, (x, y) => x + y);
        Stack <int>        stack = new Stack <int>(a.Select((Elem, Index) => new { Elem, Index }).OrderBy(x => x.Elem).Select(x => x.Index));

        long[] res = new long[nq[1]];
        //大きいクエリから降ってくるので、できるところから追加
        foreach (var item in Enumerable.Range(0, nq[1]).Select(Index => new { Index, Elem = Console.ReadLine().Split().Select(int.Parse).ToArray() }).OrderByDescending(x => x.Elem[3]))
        {
            var l = item.Elem[1] - 1;
            var r = item.Elem[2] - 1;
            var x = item.Elem[3];
            while (stack.Count != 0 && x <= a[stack.Peek()])
            {
                var ind = stack.Pop();
                rsq[ind] = a[ind];
                rcq[ind] = 1;
            }

            res[item.Index] = rsq.Query(l, r) - rcq.Query(l, r) * x;
        }
        Console.WriteLine(string.Join("\n", res));
    }
Exemplo n.º 16
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n           = inputStream.ReadInt();
            var a           = inputStream.ReadLongArray();
            var segmentTree = new SegmentTree <long?>(a.Cast <long?>().ToArray(), (x, y) =>
            {
                if (x == null)
                {
                    return(y);
                }
                else if (y == null)
                {
                    return(x);
                }
                else
                {
                    return(Gcd(x.Value, y.Value));
                }
            }, null);

            var maxGcd = segmentTree.Query(1, segmentTree.Length).Value;

            for (int i = 1; i < segmentTree.Length - 1; i++)
            {
                maxGcd = Math.Max(maxGcd, Gcd(segmentTree.Query(0, i).Value, segmentTree.Query(i + 1, segmentTree.Length).Value));
            }
            maxGcd = Math.Max(maxGcd, segmentTree.Query(0, segmentTree.Length - 1).Value);

            yield return(maxGcd);
        }
Exemplo n.º 17
0
    static void Main()
    {
        var nm = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int n  = nm[0];
        int m  = nm[1];

        SegmentTree <int> segTree = new SegmentTree <int>(m + 1, 0, (x, y) => x + y);
        int sectionIndex          = 0;

        int[][] sections = Enumerable.Repeat(0, n).Select(_ => Console.ReadLine().Split().Select(int.Parse).ToArray()).OrderBy(x => x[1] - x[0]).ToArray();
        int[]   resArr   = new int[m];
        for (int i = 1; i <= m; i++)
        {
            var res = 0;
            //???i????????????(??????????????)
            while (sectionIndex < sections.Length && sections[sectionIndex][1] - sections[sectionIndex][0] + 1 < i)
            {
                segTree.Operate(sections[sectionIndex][0], sections[sectionIndex][1] + 1, 1);
                sectionIndex++;
            }

            //??????????(????i?????????????sectionIndex?????????)
            res += nm[0] - sectionIndex;

            for (int j = 0; j <= m; j += i)
            {
                var query = segTree.Query(j);
                res += query;
            }

            resArr[i - 1] = res;
        }
        Console.WriteLine(string.Join("\n", resArr));
    }
Exemplo n.º 18
0
 public IList<int> CountSmaller(int[] nums)
 {
     int[] result = new int[nums.Length];
     SortedDictionary<int, List<int>> dict = new SortedDictionary<int, List<int>>();
     for (int i = 0; i < nums.Length; i++)
     {
         List<int> l;
         if (!dict.TryGetValue(nums[i], out l))
         {
             dict.Add(nums[i], l = new List<int>());
         }
         l.Add(i);
     }
     SegmentTree tree = new SegmentTree(0, nums.Length - 1);
     foreach (var pair in dict)
     {
         foreach (int pos in pair.Value)
         {
             result[pos] = tree.CountRange(pos + 1, nums.Length - 1);
         }
         foreach (int pos in pair.Value)
         {
             tree.Add(pos);
         }
     }
     return result.ToList();
 }
Exemplo n.º 19
0
        public static void Solve()
        {
            var NQ = Console.ReadLine().Split(" ").Select(int.Parse).ToArray();

            var(N, Q) = (NQ[0], NQ[1]);
            var A  = Console.ReadLine().Split(" ").Select(x => new S(int.Parse(x))).ToArray();
            var st = new SegmentTree <S>(A, new Oracle());

            for (var i = 0; i < Q; i++)
            {
                var TXY = Console.ReadLine().Split(" ").Select(int.Parse).ToArray();
                var(T, X, V) = (TXY[0], TXY[1], TXY[2]);
                X--;
                switch (T)
                {
                case 1:
                    st.Set(X, new S(V));
                    break;

                case 2:
                    Console.WriteLine(st.Query(X, V).Value);
                    break;

                case 3:
                    Console.WriteLine(st.MaxRight(X, v => v.Value < V) + 1);
                    break;
                }
            }
        }
Exemplo n.º 20
0
    public static void Main()
    {
        var nd      = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n       = nd[0];
        var d       = nd[1];
        var walls   = Enumerable.Repeat(0, n).Select(_ => Console.ReadLine().Split().Select(int.Parse).ToArray()).ToArray();
        var arr     = walls.SelectMany(x => x).Concat(walls.Select(x => x[1] + d - 1)).Distinct().OrderBy(x => x).ToArray();
        var dic     = arr.Select((elem, ind) => (elem, ind)).ToDictionary(x => x.elem, x => x.ind);
        var segTree = new SegmentTree <bool, bool>(dic.Count, false, false, (x, y) => x | y, (x, y) => x | y, (x, y) => x | y);
        int res     = 0;

        foreach (var wall in walls.OrderBy(x => x[1]))
        {
            var l = wall[0];
            var r = wall[1];

            if (segTree.Query(dic[l], dic[r]))
            {
                continue;
            }
            segTree.Update(dic[r], dic[r + d - 1], true);
            res++;
        }
        Console.WriteLine(res);
    }
Exemplo n.º 21
0
    public static void Main()
    {
        var nq = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nq[0];
        var q  = nq[1];
        var a  = Console.ReadLine().Split().Select(int.Parse).Prepend(0).ToArray();

        SegmentTree <int> seg = new SegmentTree <int>(a, 0, (x, y) => x ^ y);

        for (int i = 0; i < q; i++)
        {
            var txy = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var t   = txy[0];
            var x   = txy[1];
            var y   = txy[2];
            if (t == 1)
            {
                seg.Operate(x, y);
            }
            else
            {
                Console.WriteLine(seg.Query(x, y));
            }
        }
    }
Exemplo n.º 22
0
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        var p = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var q = Console.ReadLine().Split().Select(int.Parse).ToArray();

        List <int>[] indOfDivs = Enumerable.Repeat(0, n + 1).Select(_ => new List <int>()).ToArray();
        for (int i = 0; i < p.Length; i++)
        {
            for (int j = p[i]; j <= n; j += p[i])
            {
                indOfDivs[j].Add(i);
            }
        }

        // dp[i] := p を i 番目まで使って長さ k
        SegmentTree <int> dp = new SegmentTree <int>(n, 0, Max);

        foreach (var item in q)
        {
            foreach (var ind in indOfDivs[item].Reverse <int>())
            {
                dp.Operate(ind, dp.Query(0, ind - 1) + 1);
            }
        }

        Console.WriteLine(dp.Query(0, n - 1));
    }
Exemplo n.º 23
0
    static void Main()
    {
        var n = int.Parse(Console.ReadLine());
        //小さい方から見ていく
        //前に行くならできる限り前の奴が行ったほうがいいので、pqに突っ込む? いや、そこまでで一番こっちのものなのでセグ木
        var a            = Enumerable.Repeat(0, n).Select(_ => int.Parse(Console.ReadLine())).ToArray();
        var orderedGroup = a.Select((Elem, Ind) => new { Elem, Ind }).GroupBy(x => x.Elem).OrderBy(x => x.Key).ToArray();
        SegmentTree <IntTuple> segTree = new SegmentTree <IntTuple>(Enumerable.Range(0, n).Select(x => new IntTuple(x, 0)).ToArray(), new IntTuple(-1, 0), (x, y) => y.Count == 0 ? x : y);
        var res = 0;

        foreach (var group in orderedGroup)
        {
            //それぞれがどれから遷移するかを纏める
            foreach (var item in group)
            {
                var least = segTree.Query(0, item.Ind);
                if (least.Count != 0)
                {
                    segTree[least.Ind] = new IntTuple(least.Ind, least.Count - 1);
                }
                else
                {
                    res++;
                }
            }
            foreach (var item in group)
            {
                var cur = segTree[item.Ind];
                segTree[item.Ind] = new IntTuple(cur.Ind, cur.Count + 1);
            }
        }
        Console.WriteLine(res);
    }
Exemplo n.º 24
0
    public static void Main()
    {
        var nm = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var n  = nm[0];
        var m  = nm[1];

        int[][] sections = Enumerable.Repeat(0, m).Select(_ => Console.ReadLine().Split().Select(x => int.Parse(x) - 1).ToArray()).ToArray();
        SegmentTree <int, int> segTree = new SegmentTree <int, int>(Enumerable.Repeat(0, n).ToArray(), 1 << 30, 0, Min, (x, y) => x + y, (x, y) => x + y);

        foreach (var section in sections)
        {
            segTree.Update(section[0], section[1], 1);
        }
        List <int> res = new List <int>();

        for (int i = 0; i < m; i++)
        {
            if (segTree.Query(sections[i][0], sections[i][1]) <= 1)
            {
                continue;
            }
            res.Add(i + 1);
        }
        Console.WriteLine(res.Count);
        if (res.Count != 0)
        {
            Console.WriteLine(string.Join("\n", res));
        }
    }
Exemplo n.º 25
0
        static void Method(string[] args)
        {
            int    n = ReadInt();
            string s = Read();

            Queue <int>[] poses = new Queue <int> [26];
            for (int i = 0; i < 26; i++)
            {
                poses[i] = new Queue <int>();
            }

            for (int i = 0; i < n; i++)
            {
                poses[s[i] - 'a'].Enqueue(i);
            }

            int[] deltas = new int[n];
            for (int i = 0; i < n; i++)
            {
                deltas[i] = poses[s[n - 1 - i] - 'a'].Dequeue() - i;
            }

            var  tree = new SegmentTree <int>(n, (a, b) => a + b, 0, 0);
            long res  = 0;

            for (int i = 0; i < n; i++)
            {
                int to       = i + deltas[i];
                int newDelta = tree.Scan(to + 1, n - 1);
                res += newDelta;
                tree.Update(to, 1);
            }

            WriteLine(res);
        }
Exemplo n.º 26
0
    void Solve()
    {
        var x = G().ToList();
        int N = x[0], Q = x[1], A = x[2] - 1, B = x[3] - 1;

        x = G().Select(a => a - 1).ToList();
        x.Insert(0, A);
        var l = new SegmentTree(N);
        var r = new SegmentTree(N);

        l[B] = -B;
        r[B] = B;
        for (var i = 1; i <= Q; i++)
        {
            var tmp = Min(l.Min(0, x[i]) + x[i], r.Min(x[i], N) - x[i]);
            var d   = Abs(x[i] - x[i - 1]);
            l.Shift(d);
            r.Shift(d);
            l[x[i - 1]] = -x[i - 1] + tmp;
            r[x[i - 1]] = x[i - 1] + tmp;
        }
        var ans = l[0];

        for (var i = 1; i < N; i++)
        {
            ans = Min(ans, l[i] + i);
        }
        WriteLine(ans);
    }
Exemplo n.º 27
0
    static void Main()
    {
        int[]             nq  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int               n   = nq[0];
        int               q   = nq[1];
        List <int>        res = new List <int>();
        SegmentTree <int> rsq = new SegmentTree <int>(n, 0, (x, y) => x + y);

        for (int i = 0; i < q; i++)
        {
            int[] cxy = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int   c   = cxy[0];
            int   x   = cxy[1];
            int   y   = cxy[2];
            if (c == 0)
            {
                rsq[x - 1] += y;
            }
            else
            {
                res.Add(rsq.Query(x - 1, y - 1));
            }
        }
        Console.WriteLine(string.Join("\n", res));
    }
Exemplo n.º 28
0
    static void Main()
    {
        var n = int.Parse(Console.ReadLine());
        var a = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var M = 1000000007;

        var f = new long[n + 1];

        f[0] = 1;
        for (int i = 0; i < n; i++)
        {
            f[i + 1] = f[i] * (i + 1) % M;
        }

        var r  = 0L;
        var st = new SegmentTree(n + 1);

        for (int i = 0; i < n; i++)
        {
            var c = st.Sum(0, a[i]);
            r = (r + (a[i] - c - 1) * f[n - i - 1]) % M;
            st.Add(a[i], 1);
        }
        Console.WriteLine(r + 1);
    }
Exemplo n.º 29
0
    public static void Main()
    {
        var  nk  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var  n   = nk[0];
        var  k   = nk[1];
        var  p   = Console.ReadLine().Split().Select(int.Parse).ToArray();
        long res = 1;
        SegmentTree <Incr> isIncr = new SegmentTree <Incr>(p.Select(x => new Incr()
        {
            L = x, R = x, Valid = true
        }).ToArray(), new Incr()
        {
            Valid = true, L = int.MaxValue, R = int.MinValue
        }, Incr.Merge);
        SegmentTree <int> rmin = new SegmentTree <int>(p, int.MaxValue, Min);
        SegmentTree <int> rmax = new SegmentTree <int>(p, int.MinValue, Max);
        long incrCount         = isIncr.Query(0, k - 1).Valid ? 1 : 0;

        for (int i = 1; i <= n - k; i++)
        {
            if (rmax.Query(i, i + k - 1) != p[i + k - 1] || rmin.Query(i - 1, i + k - 2) != p[i - 1])
            {
                if (isIncr.Query(i, i + k - 1).Valid)
                {
                    incrCount++;
                }
                res++;
            }
        }

        Console.WriteLine(res - (incrCount <= 1 ? 0 : incrCount - 1));
    }
Exemplo n.º 30
0
        public void AddTest()
        {
            SegmentTree st = new SegmentTree(0, 16);

            st.Add(6, 12);
            Assert.IsNotNull(st.Root.LeftChild);
            Assert.IsNotNull(st.Root.RightChild);

            Assert.IsNotNull(st.Root.LeftChild.RightChild);
            Assert.IsNotNull(st.Root.RightChild.LeftChild);
            Assert.IsNotNull(st.Root.LeftChild.RightChild.RightChild);

            Assert.IsNull(st.Root.LeftChild.LeftChild);
            Assert.IsNull(st.Root.RightChild.RightChild);
            Assert.IsNull(st.Root.LeftChild.RightChild.LeftChild);

            Assert.IsFalse(st.Root.Exist);
            Assert.IsFalse(st.Root.LeftChild.Exist);
            Assert.IsFalse(st.Root.RightChild.Exist);
            Assert.IsFalse(st.Root.LeftChild.RightChild.Exist);
            Assert.IsTrue(st.Root.RightChild.LeftChild.Exist);
            Assert.IsTrue(st.Root.LeftChild.RightChild.RightChild.Exist);

            // Add (0, 2)
            st.Add(0, 16);
            Assert.IsTrue(st.Root.Exist);
            Assert.IsNull(st.Root.LeftChild);
            Assert.IsNull(st.Root.RightChild);
        }
Exemplo n.º 31
0
        static void Method(string[] args)
        {
            int q = ReadInt();
            SegmentTree <int> segTree = new SegmentTree <int>(200010, (a, b) => a + b, 0, 0);

            for (int i = 0; i < q; i++)
            {
                int[] tx = ReadInts();
                int   t  = tx[0];
                int   x  = tx[1];
                if (t == 1)
                {
                    segTree.Update(x, 1);
                }
                else
                {
                    int bottom = 0;
                    int top    = 200010;
                    while (bottom + 1 < top)
                    {
                        int mid = (bottom + top) / 2;
                        if (segTree.Scan(1, mid) < x)
                        {
                            bottom = mid;
                        }
                        else
                        {
                            top = mid;
                        }
                    }
                    WriteLine(top);
                    segTree.Update(top, 0);
                }
            }
        }
Exemplo n.º 32
0
		public void TestSimpleAdd ()
		{
			var collection = new SegmentTree<TreeSegment> ();
			
			collection.Add (new TreeSegment (10, 10));
			collection.Add (new TreeSegment (12, 2));
			collection.Add (new TreeSegment (14, 2));
			collection.Add (new TreeSegment (11, 5));
			
			Assert.AreEqual (4, collection.Segments.Count ());
		}
Exemplo n.º 33
0
 public SegmentTree(int l, int r)
 {
     s = l;
     e = r;
     if (e > s)
     {
         int m = s + (e - s) / 2;
         left = new SegmentTree(s, m);
         right = new SegmentTree(m + 1, e);
     }
 }
Exemplo n.º 34
0
		public void TestUpdateOnTextReplace ()
		{
			var collection = new SegmentTree<TreeSegment> ();
			
			collection.Add (new TreeSegment (0, 89));
			collection.Add (new TreeSegment (92, 51));
			collection.Add (new TreeSegment (42, 77));
			collection.Add (new TreeSegment (36, 128));
			collection.UpdateOnTextReplace (this, new DocumentChangeEventArgs (0, new string(' ', 355), null));
			
			Assert.AreEqual (0, collection.Count);
		}
Exemplo n.º 35
0
		public void TestGetSegmentsOverlapping ()
		{
			var collection = new SegmentTree<TreeSegment> ();
			
			collection.Add (new TreeSegment (10, 10));
			collection.Add (new TreeSegment (12, 2));
			collection.Add (new TreeSegment (14, 2));
			collection.Add (new TreeSegment (11, 5));
			
			Assert.AreEqual (4, collection.GetSegmentsOverlapping (12, 4).Count ());
			Assert.AreEqual (2, collection.GetSegmentsOverlapping (10, 1).Count ());
		}
Exemplo n.º 36
0
		public void TestGetSegmentsAt ()
		{
			var collection = new SegmentTree<TreeSegment> ();
			
			collection.Add (new TreeSegment (10, 10));
			collection.Add (new TreeSegment (12, 2));
			collection.Add (new TreeSegment (14, 2));
			collection.Add (new TreeSegment (11, 5));
			
			Assert.AreEqual (0, collection.GetSegmentsAt (9).Count ());
			Assert.AreEqual (0, collection.GetSegmentsAt (21).Count ());
			Assert.AreEqual (1, collection.GetSegmentsAt (10).Count ());
			Assert.AreEqual (2, collection.GetSegmentsAt (11).Count ());
			Assert.AreEqual (3, collection.GetSegmentsAt (12).Count ());
			Assert.AreEqual (3, collection.GetSegmentsAt (15).Count ());
		}
Exemplo n.º 37
0
		public void TestSimpleRemove ()
		{
			var collection = new SegmentTree<TreeSegment> ();
			var seg1 = new TreeSegment (10, 10);
			collection.Add (seg1);
			var seg2 = new TreeSegment (12, 2);
			collection.Add (seg2);
			var seg3 = new TreeSegment (14, 2);
			collection.Add (seg3);
			var seg4 = new TreeSegment (11, 5);
			collection.Add (seg4);
			collection.Remove (seg2);
			Assert.AreEqual (3, collection.Segments.Count ());
			collection.Remove (seg4);
			Assert.AreEqual (2, collection.Segments.Count ());
		}
Exemplo n.º 38
0
        public virtual void Dispose()
        {
            if (doc != null)
            {
                if (segmentMarkerTree != null)
                    segmentMarkerTree.RemoveListener();
                if (invalidCodeRegionTree != null)
                    invalidCodeRegionTree.RemoveListener();
            }

            GuiDocument = null;
            if (cancelTokenSource != null)
                cancelTokenSource.Cancel();
            PropertyService.PropertyChanged -= HandlePropertyChanged;
            GlobalParseCache.ParseTaskFinished -= GlobalParseCacheFilled;
            segmentMarkerTree = null;
            invalidCodeRegionTree = null;
        }
Exemplo n.º 39
0
        protected override void OnDocumentSet(EventArgs e)
        {
            base.OnDocumentSet(e);

            if (doc != null)
            {
                segmentMarkerTree = new SegmentTree<TextSegmentMarker>();
                segmentMarkerTree.InstallListener(doc);
                invalidCodeRegionTree = new SegmentTree<TreeSegment>();
                invalidCodeRegionTree.InstallListener(doc);
            }
            else
            {
                segmentMarkerTree = null;
                invalidCodeRegionTree = null;
            }
        }
Exemplo n.º 40
0
		public void ClearFoldSegments ()
		{
			InterruptFoldWorker ();
			foldSegmentTree = new SegmentTree<FoldSegment> ();
			foldSegmentTree.tree.NodeRemoved += HandleFoldSegmentTreetreeNodeRemoved; 
			foldedSegments.Clear ();
			InformFoldTreeUpdated ();
		}
Exemplo n.º 41
0
    private void Run(TextReader rd)
    {
        N = int.Parse(rd.ReadLine());
        this.rd = rd;
        tree = new SegmentTree(N, Count);

        int Q = int.Parse(rd.ReadLine());
        for (; Q > 0; Q--) {
            string[] ln = rd.ReadLine().Split(' ');
            var t = ln[0];
            QueryType type = QueryType.C;
            if (t == "X") type = QueryType.X;
            else if (t == "Y") type = QueryType.Y;
            Solve(int.Parse(ln[1]), int.Parse(ln[2]), type);
        }
        //Console.ReadKey();
    }
Exemplo n.º 42
0
    public static void Main(string[] args)
    {
        int n = Convert.ToInt32(Console.ReadLine().ToString());

        // Get and store all points
        List<Point> points = new List<Point>();
        for (int i = 0; i < n; ++i)
        {
            string[] arr_t = Console.ReadLine().Split(' ');
            int[] arr = Array.ConvertAll(arr_t, Int32.Parse);

            points.Add(new Point(arr[0], arr[1]));
        }

        // Build Segment Tree
        SegmentTree sgTree = new SegmentTree(points.ToArray(), points.Count);

        // Get number of queries and parse
        int q = Convert.ToInt32(Console.ReadLine().ToString());

        // Preprocess queries
        //   Count X and Y flips
        //   If odd then flip once
        //   Remove all others.
        bool[] XFlips = new bool[n + 1];
        bool[] YFlips = new bool[n + 1];

        System.IO.StreamWriter foutput = new System.IO.StreamWriter("output.txt");
        for (int i = 0; i < q; ++i)
        {
            // Process query
            string rawQuery = Console.ReadLine();
            string[] sQuery = rawQuery.Split(' ');
            string type = sQuery[0];
            int q_i = Convert.ToInt32(sQuery[1]) - 1;
            int q_j = Convert.ToInt32(sQuery[2]) - 1;

            if (type == "C")
            {

                // Print Result
                // Processes points (inclusive)
                int[] count = sgTree.Query(q_i + 1, q_j + 1).getArray();

                // Print to console
                Console.WriteLine("{0} {1} {2} {3}", count[0], count[1], count[2], count[3]);
                StringBuilder line = new StringBuilder();
                line.AppendFormat("{0} {1} {2} {3}", count[0], count[1], count[2], count[3]);
                foutput.WriteLine(line);

            }
            else if (type == "X")
            {
                //// Process query X
                sgTree.Update(q_i + 1, q_j + 1, QType.X);
            }
            else
            {
                //// Process query Y
                sgTree.Update(q_i + 1, q_j + 1, QType.Y);
            }
        }

        // Close file
        foutput.Close();
    }
Exemplo n.º 43
0
		public void ClearFoldSegments ()
		{
			InterruptFoldWorker ();
			foldSegmentTree.RemoveListener (this);
			foldSegmentTree = new SegmentTree<FoldSegment> ();
			foldSegmentTree.InstallListener (this);
							
			InformFoldTreeUpdated ();
		}