Submission #1497464
Source Code Expand
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
class Z
{
static void Main()
{
new K();
}
}
class K
{
static int[] G()
{
return Console.ReadLine().Split().Select(int.Parse).ToArray();
}
public K()
{
Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });
var Q = G()[0];
Tree<int> t = null;
for (int i = 0; i < Q; i++)
{
var I = G();
if (I[0] == 1) t = t.Add(I[1]);
else
{
var x = t.Element(I[1] - 1).V;
Console.WriteLine(x);
t = t.Remove(x);
}
}
Console.Out.Flush();
}
}
class Tree<T> : IEnumerable<T> where T: IComparable<T>
{
public readonly Tree<T> L, R;
public readonly T V;
public readonly int H, C;
// l < v < r and |l.h - l.r| <= 2
public Tree(Tree<T> l, T v, Tree<T> r)
{
C = 1 + l.Count() + r.Count();
var lh = l.Height();
var rh = r.Height();
if (lh > rh + 1)
{
if (l.L.Height() >= l.R.Height())
{
V = l.V;
L = l.L;
R = new Tree<T>(l.R, v, r);
}
else
{
V = l.R.V;
L = new Tree<T>(l.L, l.V, l.R.L);
R = new Tree<T>(l.R.R, v, r);
}
}
else if (rh > lh + 1)
{
if (r.R.Height() >= r.L.Height())
{
V = r.V;
L = new Tree<T>(l, v, r.L);
R = r.R;
}
else
{
V = r.L.V;
L = new Tree<T>(l, v, r.L.L);
R = new Tree<T>(r.L.R, r.V, r.R);
}
}
else
{
L = l;
R = r;
V = v;
}
H = 1 + Math.Max(L.Height(), R.Height());
}
public override string ToString()
{
return Func.ToString(this);
}
public IEnumerator<T> GetEnumerator()
{
return (IEnumerator<T>)this.InOrder();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class P<T> : IComparable<P<T>> where T: IComparable<T>
{
public int I;
public T V;
public P(int i, T v)
{
I = i;
V = v;
}
public int CompareTo(P<T> p)
{
return V.CompareTo(p.V);
}
}
static class Func
{
public static Tree<T> ConstructTree<T>(this IList<T> list) where T: IComparable<T>
{
return list.ConstructTree(0, list.Count);
}
static Tree<T> ConstructTree<T>(this IList<T> list, int l, int r) where T: IComparable<T>
{
if (l >= r) return null;
var n = (l + r) / 2;
return Join(list.ConstructTree(l, n), list[n], list.ConstructTree(n + 1, r));
}
public static List<T> Merge<T>(params List<T>[] ls)where T: IComparable<T>
{
var N = ls.Length;
var ns = new int[N];
var l = new List<T>(ls.Sum(x => x.Count));
var pq = new PriorityQueue<P<T>>();
for (int i = 0; i < N; i++) if (ls[i].Count > 0) pq.Enqueue(new P<T>(i, ls[i][ns[i] = 0]));
while (pq.Count > 0)
{
var x = pq.Dequeue();
l.Add(x.V);
var i = x.I;
if (++ns[i] < ls[i].Count) pq.Enqueue(new P<T>(i, ls[i][ns[i]]));
}
return l;
}
public static Tree<T> Merge<T>(this Tree<T> t1, Tree<T> t2) where T: IComparable<T>
{
if (t1 == null) return t2;
if (t2 == null) return t1;
return Merge(t1.ToList(), t2.ToList()).ConstructTree();
}
public static string ToString<T>(this Tree<T> t) where T: IComparable<T>
{
return t == null ? "[Empty]\n" : ToString(t, 0);
}
static string ToString<T>(this Tree<T> t, int depth) where T: IComparable<T>
{
if (t == null) return "";
var sb = new StringBuilder();
sb.Append(t.L.ToString(depth + 1));
sb.Append(' ', 2 * depth);
sb.AppendFormat("{0} - {1} - {2}\n", t.V, t.H, t.C);
sb.Append(t.R.ToString(depth + 1));
return sb.ToString();
}
public static int Count<T>(this Tree<T> t) where T: IComparable<T>
{
return t?.C ?? 0;
}
public static int Height<T>(this Tree<T> t) where T: IComparable<T>
{
return t?.H ?? 0;
}
public static bool Contains<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return false;
switch (t.V.CompareTo(x))
{
case 1:
return t.L.Contains(x);
case -1:
return t.R.Contains(x);
default:
return true;
}
}
public static Tree<T> Find<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return null;
switch (t.V.CompareTo(x))
{
case 1:
return t.L.Find(x);
case -1:
return t.R.Find(x);
default:
return t;
}
}
public static Tree<T> Add<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return new Tree<T>(null, x, null);
switch (t.V.CompareTo(x))
{
case 1:
return new Tree<T>(t.L.Add(x), t.V, t.R);
case 0:
return t;
default:
return new Tree<T>(t.L, t.V, t.R.Add(x));
}
}
public static T Min<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) return default(T);
return t.L == null ? t.V : t.L.Min();
}
public static T Max<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) return default(T);
return t.R == null ? t.V : t.R.Max();
}
public static Tree<T> RemoveMin<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) return null;
return t.L == null ? t.R : new Tree<T>(t.L.RemoveMin(), t.V, t.R);
}
public static Tree<T> RemoveMax<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) return null;
return t.R == null ? t.L : new Tree<T>(t.L, t.V, t.R.RemoveMax());
}
// t1 < t2
public static Tree<T> Join<T>(Tree<T> t1, Tree<T> t2) where T: IComparable<T>
{
return t1 == null ? t2 : Join(t1.RemoveMax(), t1.Max(), t2);
}
// t1 < x < t2
public static Tree<T> Join<T>(Tree<T> t1, T x, Tree<T> t2) where T: IComparable<T>
{
var h1 = t1.Height();
var h2 = t2.Height();
if (Math.Abs(h1 - h2) <= 1) return new Tree<T>(t1, x, t2);
return h1 > h2 ? new Tree<T>(t1.L, t1.V, Join(t1.R, x, t2)) : new Tree<T>(Join(t1, x, t2.L), t2.V, t2.R);
}
public static Tree<T> Remove<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return t;
switch (t.V.CompareTo(x))
{
case 1:
return new Tree<T>(t.L.Remove(x), t.V, t.R);
case 0:
return Join(t.L, t.R);
default:
return new Tree<T>(t.L, t.V, t.R.Remove(x));
}
}
// return { y in t | y < x}
public static Tree<T> Less<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return t;
switch (t.V.CompareTo(x))
{
case 1:
return t.L.Less(x);
case 0:
return t.L;
default:
return Join(t.L, t.V, t.R.Less(x));
}
}
// return { y in t | y > x}
public static Tree<T> Greater<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return t;
switch (t.V.CompareTo(x))
{
case 1:
return Join(t.L.Greater(x), t.V, t.R);
case 0:
return t.R;
default:
return t.R.Greater(x);
}
}
// return { y in t | y <= x}
public static Tree<T> LessEq<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return t;
switch (t.V.CompareTo(x))
{
case 1:
return t.L.LessEq(x);
case 0:
return t.L.Add(x);
default:
return Join(t.L, t.V, t.R.LessEq(x));
}
}
// return { y in t | y >= x}
public static Tree<T> GreaterEq<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return t;
switch (t.V.CompareTo(x))
{
case 1:
return Join(t.L.GreaterEq(x), t.V, t.R);
case 0:
return t.R.Add(x);
default:
return t.R.GreaterEq(x);
}
}
public static Tree<T> Span<T>(this Tree<T> t, int l, int r) where T: IComparable<T>
{
return t.Left(r).Right(l);
}
// [0, r)
public static Tree<T> Left<T>(this Tree<T> t, int r) where T: IComparable<T>
{
if (t == null || 0 >= r) return null;
var lc = t.L.Count();
if (r <= lc) return t.L.Left(r);
return Join(t.L, t.V, t.R.Left(r - lc - 1));
}
// [l, c)
public static Tree<T> Right<T>(this Tree<T> t, int l) where T: IComparable<T>
{
if (t == null) return null;
var lc = t.L.Count();
if (lc < l) return t.R.Right(l - lc - 1);
return Join(t.L.Right(l), t.V, t.R);
}
public static Tree<T> Element<T>(this Tree<T> t, int n) where T: IComparable<T>
{
if (t == null) return null;
var c = t.L.Count();
if (n < c) return t.L.Element(n);
return n == c ? t : t.R.Element(n - c - 1);
}
// x 未満の個数
public static int Rank<T>(this Tree<T> t, T x) where T: IComparable<T>
{
if (t == null) return 0;
switch (t.V.CompareTo(x))
{
case 1:
return t.L.Rank(x);
case 0:
return t.L.Count();
default:
return 1 + t.L.Count() + t.R.Rank(x);
}
}
public static IEnumerable<T> PreOrder<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) yield break;
yield return t.V;
foreach (var x in PreOrder(t.L)) yield return x;
foreach (var x in PreOrder(t.R)) yield return x;
}
public static IEnumerable<T> InOrder<T>(this Tree<T> t) where T: IComparable<T>
{
if (t != null)
{
foreach (var x in InOrder(t.L)) yield return x;
yield return t.V;
foreach (var x in InOrder(t.R)) yield return x;
}
}
public static IEnumerable<T> PostOrder<T>(this Tree<T> t) where T: IComparable<T>
{
if (t == null) yield break;
foreach (var x in PostOrder(t.L)) yield return x;
foreach (var x in PostOrder(t.R)) yield return x;
yield return t.V;
}
public static bool Balanced<T>(this Tree<T> t) where T: IComparable<T>
{
return t == null || (Math.Abs(t.L.Height() - t.R.Height()) <= 1 && t.L.Balanced() && t.R.Balanced());
}
public static bool ValidTree<T>(this Tree<T> t) where T: IComparable<T>
{
return t == null || (t.L.InRangeR(t.V) && t.R.InRangeL(t.V));
}
// l < t < r ?
public static bool InRange<T>(this Tree<T> t, T l, T r) where T:IComparable<T>
{
return t == null || (t.V.CompareTo(l) > 0 && t.V.CompareTo(r) < 0 && t.L.InRange(l, t.V) && t.R.InRange(t.V, r));
}
public static bool InRangeL<T>(this Tree<T> t, T l) where T:IComparable<T>
{
return t == null || (t.V.CompareTo(l) > 0 && t.L.InRange(l, t.V) && t.R.InRangeL(t.V));
}
public static bool InRangeR<T>(this Tree<T> t, T r) where T:IComparable<T>
{
return t == null || (t.V.CompareTo(r) < 0 && t.L.InRangeR(t.V) && t.R.InRange(t.V, r));
}
static int BadHeight<T>(this Tree<T> t) where T:IComparable<T>
{
return t == null ? 0 : 1 + Math.Max(t.L.BadHeight(), t.R.BadHeight());
}
static int BadCount<T>(this Tree<T> t) where T:IComparable<T>
{
return t == null ? 0 : 1 + t.L.BadCount() + t.R.BadCount();
}
public static bool CheckCH<T>(this Tree<T> t) where T:IComparable<T>
{
return t == null || (t.Count() == t.BadCount() && t.Height() == t.BadHeight() && t.L.CheckCH() && t.R.CheckCH());
}
public static bool CheckAll<T>(this Tree<T> t) where T:IComparable<T>
{
return t.Balanced() && t.ValidTree() && t.CheckCH();
}
}
class PriorityQueue<T> where T:IComparable<T>
{
readonly List<T> list = new List<T>();
public int Count { get; private set; }
public void Enqueue(T x)
{
var pos = Count++;
list.Add(x);
while (pos > 0)
{
var p = (pos - 1) / 2;
if (list[p].CompareTo(x) <= 0) break;
list[pos] = list[p];
pos = p;
}
list[pos] = x;
}
public T Dequeue()
{
var value = list[0];
var x = list[--Count];
list.RemoveAt(Count);
if (Count == 0) return value;
var pos = 0;
while (pos * 2 + 1 < Count)
{
var a = 2 * pos + 1;
var b = 2 * pos + 2;
if (b < Count && list[b].CompareTo(list[a]) < 0) a = b;
if (list[a].CompareTo(x) >= 0) break;
list[pos] = list[a];
pos = a;
}
list[pos] = x;
return value;
}
}
Submission Info
Submission Time |
|
Task |
C - データ構造 |
User |
selpo |
Language |
C# (Mono 4.6.2.0) |
Score |
100 |
Code Size |
11542 Byte |
Status |
AC |
Exec Time |
690 ms |
Memory |
54400 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
100 / 100 |
Status |
|
|
Set Name |
Test Cases |
Sample |
sample_01.txt, sample_02.txt |
All |
sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt |
Case Name |
Status |
Exec Time |
Memory |
sample_01.txt |
AC |
24 ms |
11348 KB |
sample_02.txt |
AC |
23 ms |
9300 KB |
subtask1_01.txt |
AC |
22 ms |
11348 KB |
subtask1_02.txt |
AC |
23 ms |
11348 KB |
subtask1_03.txt |
AC |
24 ms |
13396 KB |
subtask1_04.txt |
AC |
49 ms |
17488 KB |
subtask1_05.txt |
AC |
81 ms |
13380 KB |
subtask1_06.txt |
AC |
25 ms |
9300 KB |
subtask1_07.txt |
AC |
408 ms |
34160 KB |
subtask1_08.txt |
AC |
457 ms |
16324 KB |
subtask1_09.txt |
AC |
414 ms |
16076 KB |
subtask1_10.txt |
AC |
668 ms |
43772 KB |
subtask1_11.txt |
AC |
685 ms |
41472 KB |
subtask1_12.txt |
AC |
678 ms |
54400 KB |
subtask1_13.txt |
AC |
685 ms |
37000 KB |
subtask1_14.txt |
AC |
690 ms |
39044 KB |
subtask1_15.txt |
AC |
560 ms |
20744 KB |
subtask1_16.txt |
AC |
632 ms |
34044 KB |