結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
sekiya9311
|
| 提出日時 | 2019-10-24 23:46:21 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 454 ms / 2,000 ms |
| コード長 | 9,068 bytes |
| 記録 | |
| コンパイル時間 | 969 ms |
| コンパイル使用メモリ | 118,536 KB |
| 実行使用メモリ | 38,528 KB |
| 最終ジャッジ日時 | 2024-07-18 08:25:07 |
| 合計ジャッジ時間 | 6,223 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
namespace ProgrammingContestTemplateByDotNetCore
{
#region "Input and Output Classes"
class Scanner : IDisposable
{
private readonly Queue<string> _buffer;
private readonly char[] _sep;
private readonly TextReader _reader;
public Scanner(TextReader reader = null, char[] sep = null)
{
_buffer = new Queue<string>();
_sep = sep ?? new[] { ' ' };
_reader = reader ?? Console.In;
}
public Scanner(string path, char[] sep = null)
: this(new StreamReader(path), sep) { }
private void CheckBuffer()
{
if (_buffer.Any() || _reader.Peek() == -1)
return;
string str = string.Empty;
for (;
string.IsNullOrWhiteSpace(str);
str = _reader.ReadLine()) { }
var values = str.Split(_sep).Where(s => !string.IsNullOrWhiteSpace(s));
foreach (var item in values)
{
_buffer.Enqueue(item);
}
}
public string Next()
{
CheckBuffer();
return _buffer.Dequeue();
}
public string[] GetStringArray(int count)
=> Enumerable.Range(0, count)
.Select(e => Next())
.ToArray();
public int NextInt() => int.Parse(Next());
public int[] GetIntArray(int count)
=> Enumerable.Range(0, count)
.Select(e => NextInt())
.ToArray();
public long NextLong() => long.Parse(Next());
public long[] GetLongArray(int count)
=> Enumerable.Range(0, count)
.Select(e => NextLong())
.ToArray();
public double NextDouble() => double.Parse(Next());
public double[] GetDoubleArray(int count)
=> Enumerable.Range(0, count)
.Select(e => NextDouble())
.ToArray();
public decimal NextDecimal() => decimal.Parse(Next());
public decimal[] GetDecimalArray(int count)
=> Enumerable.Range(0, count)
.Select(e => NextDecimal())
.ToArray();
public BigInteger NextBigInt() => BigInteger.Parse(Next());
public BigInteger[] GetBigIntArray(int count)
=> Enumerable.Range(0, count)
.Select(e => NextBigInt())
.ToArray();
public bool IsEnd
{
get
{
CheckBuffer();
return !_buffer.Any();
}
}
public void Dispose()
{
if (!_reader.Equals(Console.In))
_reader.Dispose();
}
}
class Writer : IDisposable
{
private readonly TextWriter _writer;
private readonly StringBuilder _cache;
private readonly bool _isReactive;
public Writer(TextWriter writer = null, bool isReactive = false)
{
_writer = writer ?? Console.Out;
_isReactive = isReactive;
if (!_isReactive)
_cache = new StringBuilder();
}
public Writer(string path)
: this(new StreamWriter(path)) { }
public Writer(bool isReactive)
: this(null, isReactive) { }
public void Write(object value)
{
if (_isReactive)
{
_writer.Write(value);
_writer.Flush();
}
else
{
_cache.Append(value);
}
}
public void WriteFormat(string format, params object[] values)
{
var value = string.Format(format, values);
Write(value);
}
public void WriteLine(object value = null)
{
Write($"{value}{Environment.NewLine}");
}
public void WriteLine(string format, params object[] values)
{
WriteFormat($"{format}{Environment.NewLine}", values);
}
public void Dispose()
{
if (!_isReactive)
{
_writer.Write(_cache);
_writer.Flush();
}
if (!_writer.Equals(Console.Out))
{
_writer.Dispose();
}
}
}
public static class Extensions
{
public static void Set<TKey, TValue>(
this IDictionary<TKey, TValue> source,
TKey key, TValue value)
{
if (source.ContainsKey(key))
source[key] = value;
else
source.Add(key, value);
}
}
#endregion
class MainClass : IDisposable
{
#region "Template"
/// <summary> 入力を受け取る </summary>
private readonly Scanner sc;
/// <summary> 出力を行う </summary>
private readonly Writer wr;
private const string _inputFile = "input.txt";
private const string _outFile = "output.txt";
static void Main(string[] args)
{
using (new MainClass()) { }
}
public MainClass()
{
wr = new Writer(_isReactive);
// TODO: ファイルに出力したい場合はこっち → wr = new Writer(_outFile);
#if DEBUG
// 手元では、ファイルから入力を受け取る
sc = new Scanner(_inputFile);
#else
// 提出時、標準入力から受け取る
sc = new Scanner();
#endif
Solve();
}
public void Dispose()
{
sc?.Dispose();
wr?.Dispose();
}
#endregion
void Solve()
{
int N = sc.NextInt();
int Q = sc.NextInt();
SegmentTree tree = new SegmentTree(N);
var a = sc.GetIntArray(N);
for (int i = 0; i < N; i++)
{
tree.Update(i, a[i]);
}
for (int i = 0; i < Q; i++)
{
int id = sc.NextInt();
int l = sc.NextInt() - 1;
int r = sc.NextInt() - 1;
if (id == 1)
{
var leftVal = tree.Get(l, l + 1).Value;
var rightVal = tree.Get(r, r + 1).Value;
tree.Update(r, leftVal);
tree.Update(l, rightVal);
}
else
{
var res = tree.Get(l, r + 1);
wr.WriteLine(res.Index + 1);
}
}
}
/// <summary>
/// TODO: リアクティブ問題か否かを指定してね♪
/// </summary>
private const bool _isReactive = false;
}
class SegmentTree
{
public struct Pair
: IComparable<Pair>
{
public int Value { get; set; }
public int Index { get; }
public Pair(int value, int index)
{
Value = value;
Index = index;
}
public int CompareTo(Pair other)
=> Value.CompareTo(other.Value);
}
private Pair[] Data { get; }
public int Size { get; }
public readonly Pair Inf = new Pair((int)1e9, -1);
public SegmentTree(int N)
{
Size = N;
Data = Enumerable.Range(0, N << 2)
.Select(i => new Pair(Inf.Value, i))
.ToArray();
}
public void Update(int index, int value)
=> UpdateInternal(index, value, 0, 0, Size);
private void UpdateInternal(int index, int value, int k, int L, int R)
{
if (index < L || R <= index)
return;
if (L + 1 == R && index == L)
{
Data[k] = new Pair(value, index);
return;
}
var mid = (L + R) >> 1;
UpdateInternal(index, value, (k << 1) + 1, L, mid);
UpdateInternal(index, value, (k << 1) + 2, mid, R);
var val = Min(Data[(k << 1) + 1], Data[(k << 1) + 2]);
Data[k] = val;
}
public Pair Get(int l, int r) => GetInternal(l, r, 0, 0, Size);
private Pair GetInternal(int l, int r, int k, int L, int R)
{
if (R <= l || r <= L)
return Inf;
if (l <= L && R <= r)
return Data[k];
var res = Inf;
var mid = (L + R) >> 1;
if (l < mid)
res = Min(res, GetInternal(l, r, (k << 1) + 1, L, mid));
if (mid < r)
res = Min(res, GetInternal(l, r, (k << 1) + 2, mid, R));
return res;
}
private Pair Min(Pair left, Pair right)
=> left.CompareTo(right) <= 0 ? left : right;
}
}
sekiya9311