Пример #1
0
    static void Main()
    {
        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        var h = Read();
        var n = h[0];

        var st = new STR <int?>(n, (x, y) => x.HasValue ? x : y, null);

        st.Set(0, n, int.MaxValue);
        for (int k = 0; k < h[1]; k++)
        {
            var q = Read();
            if (q[0] == 0)
            {
                st.Set(q[1], q[2] + 1, q[3]);
            }
            else
            {
                Console.WriteLine(st.Get(q[1]));
            }
        }
        Console.Out.Flush();
    }
Пример #2
0
    static object Solve()
    {
        var n  = int.Parse(Console.ReadLine());
        var ps = Array.ConvertAll(new bool[n], _ => { Console.ReadLine(); return(Read()); });
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => Read2());

        var st = new STR <int>(100000, (x, y) => x + y, 0);
        var l  = new List <(int x, int y1, int y2, int d)>();

        foreach (var xys in ps)
        {
            var m2 = xys.Length / 4;
            var q  = Enumerable.Range(0, m2)
                     .Select(i => (x: xys[4 * i], y1: Math.Min(xys[4 * i + 1], xys[4 * i + 3]), y2: Math.Max(xys[4 * i + 1], xys[4 * i + 3])))
                     .OrderBy(_ => _.x);

            foreach (var(x, y1, y2) in q)
            {
                if (st.Get(y1) == 0)
                {
                    l.Add((x, y1, y2, 1));
                    st.Set(y1, y2, 1);
                }
                else
                {
                    l.Add((x, y1, y2, -1));
                    st.Set(y1, y2, -1);
                }
            }
        }

        for (int qi = 0; qi < qc; qi++)
        {
            var(x, y) = qs[qi];

            // y2: Query ID
            l.Add((x, y, qi, 2));
        }

        var r = new int[qc];

        foreach (var item in l.OrderBy(_ => _.x).ThenBy(_ => _.d))
        {
            if (item.d != 2)
            {
                var(_, y1, y2, d) = item;
                st.Set(y1, y2, d);
            }
            else
            {
                var(_, y, qi, _) = item;
                r[qi]            = st.Get(y);
            }
        }

        return(string.Join("\n", r));
    }
Пример #3
0
    static void Main()
    {
        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        var h = Read();
        var n = h[0];

        var st = new STR <long>(n + 1, (x, y) => x + y, 0);

        for (int k = 0; k < h[1]; k++)
        {
            var q = Read();
            if (q[0] == 0)
            {
                st.Set(q[1], q[2] + 1, q[3]);
            }
            else
            {
                Console.WriteLine(st.Get(q[1]));
            }
        }
        Console.Out.Flush();
    }
Пример #4
0
    static void Main()
    {
        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        var n   = int.Parse(Console.ReadLine());
        var map = Array.ConvertAll(new int[n], _ => Read().Skip(1).ToList());
        var qc  = int.Parse(Console.ReadLine());
        var qs  = Array.ConvertAll(new int[qc], _ => Read());

        var et = new EulerTour(n, 0, map);
        var st = new STR <long>(2 * n, (x, y) => x + y, 0);

        foreach (var q in qs)
        {
            if (q[0] == 0)
            {
                st.Set(et.ordersMap[q[1]][0], et.ordersMap[q[1]].Last() + 1, q[2]);
            }
            else
            {
                Console.WriteLine(st.Get(et.ordersMap[q[1]][0]));
            }
        }
        Console.Out.Flush();
    }
Пример #5
0
    static void Main()
    {
        var h = Read();
        int n = h[0], q = h[1];
        var rs = new int[n].Select(_ => Read()).ToArray();
        var ps = new int[q].Select(_ => Read()).ToArray();

        var ys = rs.Select(r => r[1]).Concat(rs.Select(r => r[1] + r[2])).Concat(ps.Select(p => p[1])).Distinct().OrderBy(v => v).ToArray();
        var yd = Enumerable.Range(0, ys.Length).ToDictionary(i => ys[i]);

        // ソートのため、cost を -1 倍。
        var xqs = rs.Select(r => (x: r[0], c: -r[3], ymin: yd[r[1]], ymax: yd[r[1] + r[2]] + 1))
                  .Concat(rs.Select(r => (x: r[0] + r[2], c: r[3], ymin: yd[r[1]], ymax: yd[r[1] + r[2]] + 1)))
                  .Concat(ps.Select((p, id) => (x: p[0], c: 0, ymin: yd[p[1]], ymax: id)))
                  .OrderBy(xq => xq);

        var cost = new long[q];
        var st   = new STR <long>(ys.Length, (x, y) => x + y, 0);

        foreach (var(_, c, ymin, ymax) in xqs)
        {
            if (c == 0)
            {
                cost[ymax] = st.Get(ymin);
            }
            else
            {
                st.Set(ymin, ymax, -c);
            }
        }

        Console.WriteLine(string.Join("\n", cost));
    }
Пример #6
0
    static void Main()
    {
        var h = Read();
        int n = h[0], k = h[1];
        var a = Read();

        // TLE
        var st = new STR <int>(n, (x, y) => x + y, 0);

        for (int c = 0; c < k; c++)
        {
            for (int i = 0; i < n; i++)
            {
                st.Set(Math.Max(0, i - a[i]), Math.Min(n, i + a[i] + 1), 1);
            }

            var b = new int[n];
            for (int i = 0; i < n; i++)
            {
                b[i] = st.Get(i);
            }

            if (Enumerable.SequenceEqual(a, b))
            {
                break;
            }
            a = b;
            st.Init();
        }
        Console.WriteLine(string.Join(" ", a));
    }
Пример #7
0
    static void Main()
    {
        var(n, qc) = Read2();
        var qs = Array.ConvertAll(new bool[qc], _ => Read());

        var st = new STR <int>(2 * n + 1, (x, y) => x + y, 0);

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var q in qs)
        {
            var k = q[1];

            if (q[0] == 1)
            {
                var v = st.Get(k);
                Console.WriteLine(v % 2 == 0 ? k : 2 * n - k + 1);
            }
            else
            {
                st.Set(n - k + 1, n + k + 1, 1);
            }
        }
        Console.Out.Flush();
    }
Пример #8
0
    static void Main()
    {
        var h = Read();
        int n = h[0], k = h[1];
        var a = Array.ConvertAll(new int[n], _ => int.Parse(Console.ReadLine()));

        var st = new STR <int>(kM + 1, Math.Max, 0);

        for (int i = 0; i < n; i++)
        {
            st.Set(Math.Max(0, a[i] - k), Math.Min(kM + 1, a[i] + k + 1), st.Get(a[i]) + 1);
        }

        Console.WriteLine(Enumerable.Range(0, kM + 1).Max(st.Get));
    }
Пример #9
0
    static object Solve()
    {
        var(n, m) = Read2();
        var qs = Array.ConvertAll(new bool[m], _ => Read2());

        var st = new STR <int>(n + 1, (x, y) => x + y, 0);

        var c = 0L;

        foreach (var(l, r) in qs.OrderBy(_ => _.r).ThenBy(_ => - _.l))
        {
            c += st.Get(l) + st.Get(r);
            st.Set(l + 1, r, 1);
        }
        return(c);
    }
Пример #10
0
    static void Main()
    {
        var n  = int.Parse(Console.ReadLine());
        var a  = Read();
        var qc = int.Parse(Console.ReadLine());
        var qs = Array.ConvertAll(new bool[qc], _ => Read3());

        var d   = a.GroupBy(x => x).ToDictionary(g => g.Key, g => g.LongCount());
        var sum = d.Values.Sum(c => c * (c - 1) / 2);

        void Add(int x, int count)
        {
            var c = d.GetValueOrDefault(x);

            sum -= c * (c - 1) / 2;
            c   += count;
            sum += c * (c - 1) / 2;
            d[x] = c;
        }

        var ruq = new STR <int>(n, (x, y) => x == -1 ? y : x, -1);
        var rs  = new int[n];

        for (var(l, r) = (0, 1); r <= n; r++)
        {
            if (r == n || a[r] != a[r - 1])
            {
                ruq.Set(l, r, l);
                rs[l] = r;
                l     = r;
            }
        }

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        foreach (var q in qs)
        {
            var(L, R, X) = q;
            L--;

            var ll = ruq.Get(L);
            var rl = ruq.Get(R - 1);
            var rr = rs[rl];
            var lx = a[ll];
            var rx = a[rl];

            // 関連する区間を全て除きます。
            for (int l = ll; l < rr; l = rs[l])
            {
                Add(a[l], -(rs[l] - l));
            }

            Add(lx, L - ll);
            Add(X, R - L);
            Add(rx, rr - R);

            rs[ll] = L;

            a[L] = X;
            ruq.Set(L, R, L);
            rs[L] = R;

            if (R < rr)
            {
                a[R] = rx;
                ruq.Set(R, rr, R);
                rs[R] = rr;
            }

            Console.WriteLine(sum);
        }
        Console.Out.Flush();
    }