예제 #1
0
    static void Main()
    {
        int n  = sc.Int;
        var sg = new Segtree <int>(n, -1, Math.Min, n);

        sg.update(0, 0);
        int xor = 0;

        for (int i = 0; i < n - 1; i++)
        {
            int c, a;
            sc.Multi(out c, out a);
            int ok = 0, ng = i + 2;
            while (ng - ok > 1)
            {
                int m = (ok + ng) / 2;
                if (sg.run(0, m) > i - c)
                {
                    ok = m;
                }
                else
                {
                    ng = m;
                }
            }
            sg.update(ok, i + 1);
            if (a % 2 == 1)
            {
                xor ^= ok;
            }
        }
        Prt(xor != 0 ? "First" : "Second");
        sw.Flush();
    }
예제 #2
0
    static void Main()
    {
        SourceExpander.Expander.Expand();

        // https://atcoder.jp/contests/practice2/tasks/practice2_j
        var line = Console.ReadLine().Split(' ');
        var N    = int.Parse(line[0]);
        var Q    = int.Parse(line[1]);
        var seg  = new Segtree <long, Op>(Console.ReadLine().Split(' ').Select(long.Parse).ToArray());

        for (int q = 0; q < Q; q++)
        {
            line = Console.ReadLine().Split(' ');
            int t = int.Parse(line[0]);
            int l = int.Parse(line[1]) - 1;
            int r = int.Parse(line[2]);
            switch (t)
            {
            case 1:
                seg[l] = r;
                break;

            case 2:
                Console.WriteLine(seg.Prod(l, r));
                break;

            case 3:
                Console.WriteLine(1 + seg.MaxRight(l, num => num < r));
                break;
            }
        }
    }
예제 #3
0
        public static TValue[] ToArray <TValue, TOp>(this Segtree <TValue, TOp> seg)
            where TOp : struct, ISegtreeOperator <TValue>
        {
            var data = seg.d;

            return(data.AsSpan(data.Length / 2, seg.Length).ToArray());
        }
예제 #4
0
파일: 2455671.cs 프로젝트: qifanyyy/CLCDSA
    static void Main()
    {
        int n, m;

        sc.Multi(out n, out m);
        var a   = new P[n];
        var b   = new P[m];
        var all = new List <int>();

        for (int i = 0; i < n; i++)
        {
            a[i] = sc.Pair <int, int>();
            all.Add(a[i].v1);
            all.Add(a[i].v2);
        }
        for (int i = 0; i < m; i++)
        {
            b[i] = sc.Pair <int, int>();
            all.Add(b[i].v1);
            all.Add(b[i].v2);
        }
        all = all.Distinct().ToList();
        all.Sort();
        var zip = all.Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i);

        a = a.Select(x => new P(zip[x.v1], zip[x.v2])).ToArray();
        b = b.Select(x => new P(zip[x.v1], zip[x.v2])).ToArray();
        Array.Sort(a, (x, y) => y.v2.CompareTo(x.v2));
        Array.Sort(b, (x, y) => y.v1.CompareTo(x.v1));
        var sg = new Segtree <P>(all.Count, (x, y) => x.v2 > y.v2 ? x.v1 > 0 ? x : y : y.v1 > 0 ? y : x, new P(0, -1));

        for (int i = 0; i < all.Count; i++)
        {
            sg.assign(i, new P(0, i));
        }

        sg.all_update();
        int bi = 0, ans = 0;

        for (int i = 0; i < n; i++)
        {
            while (bi < m && a[i].v2 <= b[bi].v1)
            {
                sg.update(b[bi].v2, new P(sg.look(b[bi].v2).v1 + 1, b[bi].v2));
                ++bi;
            }
            var p = sg.run(0, a[i].v1 + 1);
            if (p.v1 > 0)
            {
                ++ans;
                sg.update(p.v2, new P(p.v1 - 1, p.v2));
            }
        }
        Prt(ans);
        sw.Flush();
    }
 public void ToArray()
 {
     for (int i = 0; i < 20; i++)
     {
         var seg = new Segtree <int, Op>(i);
         for (int j = 0; j < i; j++)
         {
             seg[j] = j;
         }
         seg.ToArray().Should().Equal(Enumerable.Range(0, i));
     }
 }
예제 #6
0
    public static long Calc(int n)
    {
        n >>= 1;
        long ans = 0;
        var  seg = new Segtree <long, Op>(n);

        for (int i = 0; i < n; i++)
        {
            seg[i] = i;
        }
        for (int i = 0; 2 * i <= n; i++)
        {
            ans ^= seg[i..(2 * i)];
    public static long Calc(int n)
    {
        n >>= 1;
        long ans = 0;
        var  seg = new Segtree <long, Op>(n);

        for (int i = 0; i < n; i++)
        {
            seg[i] = i;
        }
        for (int i = 0; 2 * i <= n; i++)
        {
            ans ^= seg.MaxRight(i, l => l * 3 / 2 <= i);
        }
        return(ans);
    }
예제 #8
0
파일: 1590173.cs 프로젝트: qifanyyy/CLCDSA
    void calc()
    {
        cin = new Scanner();
        int N = cin.nextInt();

        int[] A = cin.ArrayInt(N, -1);


        prePos = new int[N];
        List <int> AList = new List <int>();
        List <int> BList = new List <int>();

        for (int i = 0; i < A.Length; i++)
        {
            if (i % 2 == 0)
            {
                AList.Add(MAX - A[i]);
            }
            else
            {
                BList.Add(MAX - A[i]);
            }
            prePos[A[i]] = i;
        }

        seg    = new Segtree[2];
        seg[0] = new Segtree(AList.Count, AList.ToArray());
        seg[1] = new Segtree(BList.Count, BList.ToArray());

        a     = new List <int>();
        b     = new List <int>();
        h     = new PriorityQueue <long>();
        next  = new List <int> [N];
        nowID = 0;

        q = new Queue <Tuple <int, int, int> >();
        q.Enqueue(Tuple.Create(0, N, -1));
        while (q.Count != 0)
        {
            var nextQuery = q.Dequeue();
            dfs(nextQuery.Item1, nextQuery.Item2, nextQuery.Item3);
        }

        h.Enqueue(-hash(a[0], b[0], 0));

        List <long> ansArray = new List <long>();

        while (h.Count != 0)
        {
            var  nextNode = -h.Dequeue();
            long anum     = (nextNode >> 40);
            long bnum     = (nextNode >> 20) & 0xFFFFF;
            ansArray.Add(MAX - anum + 1);
            ansArray.Add(MAX - bnum + 1);
            int id = (int)(nextNode & 0xFFFFF);
            foreach (var item in next[id])
            {
                h.Enqueue(-hash(a[item], b[item], item));
            }
        }
        Console.WriteLine(string.Join(" ", ansArray));
    }