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(); }
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; } } }
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()); }
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)); } }
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); }
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)); }