結果

問題 No.1391 ±1 Abs Sum
ユーザー eSeFeSeF
提出日時 2020-11-08 12:46:21
言語 C#(csc)
(csc 3.9.0)
結果
AC  
実行時間 139 ms / 2,000 ms
コード長 36,832 bytes
コンパイル時間 2,714 ms
コンパイル使用メモリ 119,296 KB
実行使用メモリ 44,928 KB
最終ジャッジ日時 2024-07-22 15:05:04
合計ジャッジ時間 7,378 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 34
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #
プレゼンテーションモードにする

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Numerics;
using System.Threading;
using System.Runtime.CompilerServices;
using System.Diagnostics;
using static System.Math;
using static System.Array;
using static AtCoder.Cout;
using static AtCoder.Tool;
using static AtCoder.Graph;
using static AtCoder.ModInt;
namespace AtCoder
{
class AC
{
const int MOD = 1000000007;
//const int MOD = 998244353;
const int INF = int.MaxValue / 2;
const long SINF = long.MaxValue / 3;
static readonly int[] dI = { 0, 1, 0, -1, 1, -1, -1, 1 };
static readonly int[] dJ = { 1, 0, -1, 0, 1, 1, -1, -1 };
static void Main(string[] args)
{
//var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }; Console.SetOut(sw);
/*var th = new Thread(Run, 1 << 26);
th.Start();
th.Join();*/
Run();
Console.Out.Flush();
}
static void Run()
{
int Testcase = 1;
//Testcase = Cin.Int;
for (var _ = 0; _ < Testcase; _++) Solve();
}
static void Solve()
{
Cin.Scanf(out int N, out int K);
var A = Cin.ReadSplitLong;
long ans = SINF;
int l = 0, r = K - 1;
//[l, r] +1
long now = 0;
for (var i = 0; i < N; i++)
{
if (i <= r) now += Abs(A[0] - A[i]);
else now -= Abs(A[0] - A[i]);
}
for(var i = 0; i < N; i++)
{
/*OutL($"DEBUG");
var ls = new List<long>();
for (var j = 0; j < N; j++) ls.Add(Abs(A[i] - A[j]));
ls.Sort();
Out_Sep(ls);
long s = 0;
for (var j = 0; j < K; j++) s += ls[j];
for (var j = K; j < N; j++) s -= ls[j];
OutL($"s={s}");*/
//x=A[i]
while (r < i || (r + 1 < N && Abs(A[l] - A[i]) > Abs(A[r + 1] - A[i])))
{
now = (now - 2 * Abs(A[i] - A[l]) + 2 * Abs(A[i] - A[r + 1]));
r++;
l++;
}
ans = Min(ans, now);
//OutL($"now={now}");
//x
now -= (i - l + 1 + N - 1 - r - (l + (r - i))) * A[i];
if (i + 1 < N)
{
now += (i - l + 1 + N - r - (l + (r - i - 1))) * A[i + 1];
now += -2 * A[i + 1];
}
}
OutL(ans);
}
}
public struct Edge
{
public int from, to;
public long w;
public double dw;
public Edge(int to, long weight) { this.to = to; w = weight; from = -1; dw = -1; }
public Edge(int from, int to, long weight) { this.from = from; this.to = to; w = weight; dw = -1; }
public Edge(int to, double weight) { this.to = to; from = -1; w = -1; dw = weight; }
}
struct ModInt
{
public long value;
const int MOD = 1000000007;
//const int MOD = 998244353;
public ModInt(long value) { this.value = value; }
public override string ToString() => value.ToString();
public static implicit operator ModInt(long a)
{
var ret = a % MOD;
return new ModInt(ret < 0 ? (ret + MOD) : ret);
}
public static ModInt operator +(ModInt a, ModInt b) => (a.value + b.value);
public static ModInt operator -(ModInt a, ModInt b) => (a.value - b.value);
public static ModInt operator *(ModInt a, ModInt b) => (a.value * b.value);
public static ModInt operator /(ModInt a, ModInt b) => a * Modpow(b, MOD - 2);
public static ModInt operator <<(ModInt a, int n) => (a.value << n);
public static ModInt operator >>(ModInt a, int n) => (a.value >> n);
public static ModInt operator ++(ModInt a) => a.value + 1;
public static ModInt operator --(ModInt a) => a.value - 1;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ModInt Modpow(ModInt a, long n)
{
if (n == 0) return 1;
if (n < 0) return Modpow(Modpow(a, -n), MOD - 2);
var k = a;
ModInt ret = 1;
while (n > 0)
{
if ((n & 1) != 0) ret *= k;
k *= k;
n >>= 1;
}
return ret;
}
private static readonly List<long> Factorials = new List<long>() { 1 };
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ModInt Fac(int n)
{
if (n < 0) return 0;
for (var i = Factorials.Count(); i <= n; i++)
{
Factorials.Add((Factorials[i - 1] * i) % MOD);
}
return Factorials[n];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ModInt nCr(int n, int r)
{
if (n < 0 || r < 0) return 0;
return n < r ? 0 : Fac(n) / (Fac(r) * Fac(n - r));
}
public static explicit operator int(ModInt a) => (int)a.value;
}
public static class Graph
{
const long inf = long.MaxValue / 3;
public static List<List<T>> Gen_Graph<T>(int size)
{
var ret = new List<List<T>>();
for (var i = 0; i < size; i++) ret.Add(new List<T>());
return ret;
}
public static long[] Dijkstra(List<List<Edge>> G, int st)
{
int N = G.Count();
long[] ret = new long[N];
var V = new Priority_Queue<Tuple<long, int>>((x, y) => Sig(x.Item1 - y.Item1));
for (var i = 0; i < N; i++) ret[i] = inf;
ret[st] = 0; V.Enqueue(new Tuple<long, int>(0, st));
while (V.Any())
{
var cur = V.Dequeue();
int v = cur.Item2;
long cd = cur.Item1;
if (ret[v] < cd) continue;
foreach (var ed in G[v])
{
if (ret[ed.to] > cd + ed.w)
{
ret[ed.to] = cd + ed.w;
V.Enqueue(new Tuple<long, int>(ret[ed.to], ed.to));
}
}
}
return ret;
}
public static long[] Bellman_Frod(List<Edge> E, int st, int N, out bool neg_close)
{
var ret = new long[N];
for (var i = 0; i < N; i++) ret[i] = inf;
ret[st] = 0;
for (var i = 0; i < N; i++)
{
foreach (var ed in E)
{
if (ret[ed.from] != inf && ret[ed.to] > ret[ed.from] + ed.w)
{
if (i == N - 1) { neg_close = true; return ret; }
ret[ed.to] = ret[ed.from] + ed.w;
}
}
}
neg_close = false;
return ret;
}
}
public class SCC
{
int n;
struct Edge_S { public int from, to; public Edge_S(int f, int t) { from = f; to = t; } }
List<Edge_S> E;
int[] id;
public SCC(int size) { n = size; E = new List<Edge_S>(); }
public void Add_Edge(int from, int to)
{
E.Add(new Edge_S(from, to));
}
public int[][] Scc_Result()
{
var start = new int[n + 1];
var nxt = new int[E.Count];
//var scc = new List<List<int>>();
foreach (var ed in E) start[ed.from + 1]++;
for (var i = 0; i < n; i++) start[i + 1] += start[i];
var itr = new int[n + 1]; for (var i = 0; i <= n; i++) itr[i] = start[i];
foreach (var ed in E) nxt[itr[ed.from]++] = ed.to;
int now = 0;
int[] ord = new int[n];
int[] low = new int[n];
id = new int[n];
var V = new Stack<int>();
for (var i = 0; i < n; i++) ord[i] = -1;
int nowid = 0;
Action<int> DFS = null;
DFS = (v) =>
{
low[v] = ord[v] = now++;
V.Push(v);
for (var i = start[v]; i < start[v + 1]; i++)
{
var nx = nxt[i];
if (ord[nx] == -1)
{
DFS(nx);
low[v] = Min(low[v], low[nx]);
}
else
{
low[v] = Min(low[v], ord[nx]);
}
}
if (low[v] == ord[v])
{
while (true)
{
var u = V.Pop();
id[u] = nowid;
ord[u] = n + 1;
if (u == v) break;
}
nowid++;
}
};
for (var i = 0; i < n; i++) if (ord[i] == -1) DFS(i);
for (var i = 0; i < n; i++)
{
id[i] = nowid - 1 - id[i];
itr[i] = 0;
}
var scc = new int[nowid][];
for (var i = 0; i < n; i++) itr[id[i]]++;
for (var i = 0; i < nowid; i++) scc[i] = new int[itr[i]];
for (var i = 0; i < n; i++) scc[id[i]][--itr[id[i]]] = i;
/*
for (var i = 0; i < nowid; i++) scc.Add(new List<int>());
for (var i = 0; i < n; i++) scc[id[i]].Add(i);*/
return scc;
}
public int v_id(int v) => id[v];
}
public class Two_SAT
{
// use with SCC Library
int n;
bool[] result;
SCC scc;
readonly int md;
public Two_SAT(int size)
{
n = size;
result = new bool[n];
scc = new SCC(n << 1);
md = n << 1;
}
public void Add_Closure(int i, bool fi, int j, bool fj)
{
if (!fi) i += n;
if (!fj) j += n;
scc.Add_Edge((i + n) % md, j);
scc.Add_Edge((j + n) % md, i);
}
public bool Satisfy()
{
scc.Scc_Result();
for (var i = 0; i < n; i++)
{
int j = scc.v_id(i), k = scc.v_id(i + n);
if (j == k) return false;
result[i] = j > k;
}
return true;
}
public bool[] ans() => result;
}
public class Dinic
{
readonly int n;
const int inf = int.MaxValue / 2;
public class Edge_F
{
public int _to { get; set; }
public long _cap { get; set; }
public int _rev { get; set; }
public Edge_F(int to, long cap, int rev) { _to = to; _cap = cap; _rev = rev; }
}
List<List<Edge_F>> G;
int[] level, itr;
public Dinic(int vertice)
{
n = vertice;
level = new int[n];
itr = new int[n];
G = new List<List<Edge_F>>();
for (var _ = 0; _ < n; _++) G.Add(new List<Edge_F>());
}
/*================ ^ _ ^ ==================*/
//from->to,cap
public void Add_Edge(int from, int to, long cap)
{
G[from].Add(new Edge_F(to, cap, G[to].Count()));
G[to].Add(new Edge_F(from, 0, G[from].Count() - 1));
}
//bfslevel
void Bfs(int s)
{
//Fill使...
for (var i = 0; i < n; i++) level[i] = -1;
level[s] = 0;
var Q = new Queue<int>();
Q.Enqueue(s);
while (Q.Any())
{
int v = Q.Dequeue();
foreach (var ed in G[v])
{
if (ed._cap > 0 && level[ed._to] == -1)
{
level[ed._to] = level[v] + 1;
Q.Enqueue(ed._to);
}
}
}
}
//dfs
long Dfs(int v, int t, long f)
{
if (v == t) return f;
for (var i = itr[v]; i < G[v].Count(); i++)
{
itr[v] = i;
var ed = G[v][i];
if (ed._cap > 0 && level[v] < level[ed._to])
{
var d = Dfs(ed._to, t, Min(f, ed._cap));
if (d > 0)
{
ed._cap -= d;
G[ed._to][ed._rev]._cap += d;
return d;
}
}
}
return 0;
}
//s->t
//:O(N^2M)
//:O(M*Sqrt(N))
//:O(min(n^{2/3},m^{1/2})*m)
//
public long Max_Flow(int s, int t)
{
long ret = 0;
for (; ; )
{
Bfs(s);
if (level[t] == -1) return ret;
for (var i = 0; i < n; i++) itr[i] = 0;
var flow = 0L;
do { ret += flow; flow = Dfs(s, t, inf); }
while (flow > 0);
}
}
//
public List<List<Edge_F>> GetGraph() => G;
}
public class MinCostFlow
{
const long inf = long.MaxValue / 3;
int n;
public class Edge
{
public int _to, _cap, _rev;
public long _cost;
public bool _isrev;
public Edge(int to, int cap, long cost, int rev, bool isrev)
{
_to = to; _cap = cap; _rev = rev; _cost = cost; _isrev = isrev;
}
}
List<List<Edge>> G;
public MinCostFlow(int size)
{
n = size;
G = new List<List<Edge>>();
for (var i = 0; i < n; i++) G.Add(new List<Edge>());
}
/**/
public void Add_Edge(int s, int t, int cap, long cost)
{
G[s].Add(new Edge(t, cap, cost, G[t].Count(), false));
G[t].Add(new Edge(s, 0, -cost, G[s].Count() - 1, true));
}
public long MinCost(int s, int t, int f)
{
long ret = 0;
var h = new long[n];
var dist = new long[n];
var pre_v = new int[n];
var pre_e = new int[n];
var V = new Priority_Queue<(long, int)>((x, y) => Sig(x.Item1 - y.Item1));
while (f > 0)
{
for (var i = 0; i < n; i++) { dist[i] = inf; pre_v[i] = pre_e[i] = -1; }
dist[s] = 0;
V.Enqueue((0, s));
while (V.Any())
{
var (cd, v) = V.Dequeue();
if (dist[v] < cd) continue;
for (var i = 0; i < G[v].Count(); i++)
{
var ed = G[v][i];
if (ed._cap <= 0) continue;
if (dist[ed._to] + h[ed._to] > cd + h[v] + ed._cost)
{
dist[ed._to] = cd + ed._cost + h[v] - h[ed._to];
pre_v[ed._to] = v;
pre_e[ed._to] = i;
V.Enqueue((dist[ed._to], ed._to));
}
}
}
if (dist[t] == inf) { return -inf; }
for (var i = 0; i < n; i++) h[i] += dist[i];
var nowflow = f;
for (var now = t; now != s; now = pre_v[now])
{
nowflow = Min(nowflow, G[pre_v[now]][pre_e[now]]._cap);
}
f -= nowflow;
ret += nowflow * h[t];
for (var now = t; now != s; now = pre_v[now])
{
var rv = G[pre_v[now]][pre_e[now]]._rev;
G[pre_v[now]][pre_e[now]]._cap -= nowflow;
G[now][rv]._cap += nowflow;
}
}
return ret;
}
public List<List<Edge>> GetEdges() => G;
}
public class LCA
{
List<List<int>> G1;
List<List<Edge>> G2;
int n;
bool isweighted;
int[] dist;
long[] dist_w;
int[,] par;
public LCA(List<List<int>> G)
{
G1 = G;
G2 = null;
n = G1.Count();
isweighted = false;
dist = new int[n];
dist_w = null;
par = new int[25, n];
}
public LCA(List<List<Edge>> G)
{
G1 = null;
G2 = G;
n = G2.Count();
isweighted = true;
dist = new int[n];
dist_w = new long[n];
par = new int[25, n];
}
public void Lca_Build(int root)
{
for (var i = 0; i < n; i++)
{
dist[i] = -1;
if (isweighted) dist_w[i] = -1;
}
var dfs = new Stack<int>();
dfs.Push(root);
dist[root] = 0;
if (isweighted) dist_w[root] = 0;
par[0, root] = -1;
while (dfs.Any())
{
int v = dfs.Pop();
if (isweighted)
{
foreach (var ed in G2[v])
{
if (dist[ed.to] != -1) continue;
par[0, ed.to] = v;
dist_w[ed.to] = dist[v] + ed.w;
dist[ed.to] = dist[v] + 1;
dfs.Push(ed.to);
}
}
else
{
foreach (var nx in G1[v])
{
if (dist[nx] != -1) continue;
par[0, nx] = v;
dist[nx] = dist[v] + 1;
dfs.Push(nx);
}
}
}
for (var i = 1; i < 25; i++)
{
for (var j = 0; j < n; j++)
{
if (par[i - 1, j] == -1) par[i, j] = -1;
else par[i, j] = par[i - 1, par[i - 1, j]];
}
}
}
public int Lca(int u, int v)
{
if (dist[u] < dist[v])
{
var kep = u;
u = v;
v = kep;
}
for (var i = 0; i < 30; i++)
{
if ((((dist[u] - dist[v]) >> i) & 1) != 0)
{
u = par[i, u];
}
}
if (u == v) return u;
for (var i = 24; i >= 0; i--)
{
if (par[i, u] != par[i, v])
{
u = par[i, u];
v = par[i, v];
}
}
return par[0, u];
}
public int[] GetDist() => dist;
public long[] GetWeightedDist() => dist_w;
}
public class Priority_Queue<T>
{
private List<T> Q;
private readonly Comparison<T> Func_Compare;
public Priority_Queue(Comparison<T> comp)
{
Func_Compare = comp;
Q = new List<T>();
}
private void PushHeap(T item)
{
int n = Q.Count();
Q.Add(item);
while (n != 0)
{
int pIndex = (n - 1) / 2;
if (Func_Compare(Q[n], Q[pIndex]) < 0)
{
Swap(n, pIndex);
}
else { break; }
n = pIndex;
}
}
private void PopHeap()
{
int n = Q.Count() - 1;
Q[0] = Q[n];
Q.RemoveAt(n);
int cur = 0;
int comp;
while (2 * cur + 1 <= n - 1)
{
int c1 = 2 * cur + 1;
int c2 = 2 * (cur + 1);
if (c1 == n - 1)
{
comp = c1;
}
else
{
comp = Func_Compare(Q[c1], Q[c2]) < 0 ? c1 : c2;
}
if (Func_Compare(Q[cur], Q[comp]) > 0)
{
Swap(cur, comp);
}
else { break; }
cur = comp;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Swap(int a, int b)
{
T keep = Q[a];
Q[a] = Q[b];
Q[b] = keep;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Enqueue(T value) => PushHeap(value);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Dequeue()
{
T ret = Q[0];
PopHeap();
return ret;
}
public T Peek() => Q[0];
public int Count() => Q.Count();
public bool Any() => Q.Any();
}
public class SegmentTree<T>
{
//1-indexed type
int n;
T[] Tree;
Func<T, T, T> f;
T ex;
int len;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public SegmentTree(int size, Func<T, T, T> fun, T exvalue)
{
ex = exvalue;
f = fun;
len = size;
n = 1;
while (n < size) n <<= 1;
Tree = new T[n << 1];
for (var i = 0; i < Tree.Length; i++) Tree[i] = ex;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Set_All()
{
for (var i = n - 1; i >= 1; i--) Tree[i] = f(Tree[i << 1], Tree[(i << 1) | 1]);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Assign(int idx, T nxt) => Tree[idx + n] = nxt;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Update(int idx)
{
int now = idx + n;
while (now > 1)
{
now >>= 1;
Tree[now] = f(Tree[now << 1], Tree[now << 1 | 1]);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Query_Update(int idx, T nxt)
{
Assign(idx, nxt); Update(idx);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Query_Update_func(int idx, T y)
{
Assign(idx, f(Peek(idx), y)); Update(idx);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Query_Fold(int l, int r)
{
int L = n + l;
int R = n + r;
T vL = ex, vR = ex;
while (L < R)
{
if (L % 2 == 1)
{
vL = f(vL, Tree[L]);
L++;
}
if (R % 2 == 1)
{
vR = f(Tree[R - 1], vR);
R--;
}
L >>= 1;
R >>= 1;
}
return f(vL, vR);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Peek(int idx) => Tree[idx + n];
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Display(int len)
{
for (var i = 0; i < len; i++) Console.Write($"{Tree[i + n]} ");
Console.WriteLine();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int MaxRight(int l, Func<T, bool> ok)
{
if (l == len) { return len; }
l += n;
var sum = ex;
do
{
while (l % 2 == 0) l >>= 1;
if (!ok(f(sum, Tree[l])))
{
while (l < n)
{
l <<= 1;
if (ok(f(sum, Tree[l])))
{
sum = f(sum, Tree[l++]);
}
}
return l - n;
}
sum = f(sum, Tree[l++]);
} while ((l & (-l)) != l);
return len;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int MinLeft(int r, Func<T, bool> ok)
{
if (r == 0) return 0;
r += n;
var sum = ex;
do
{
r--;
while (r > 1 && (r % 2) != 0) r >>= 1;
if (!ok(f(Tree[r], sum)))
{
while (r < n)
{
r = (r << 1 | 1);
if (ok(f(Tree[r], sum)))
{
sum = f(Tree[r--], sum);
}
}
return r + 1 - n;
}
sum = f(Tree[r], sum);
} while ((r & (-r)) != r);
return 0;
}
}
public class LazySegmentTree<X, A>
{
int n, L;
X[] Tree;
A[] lazy;
Func<X, X, X> fxx;
Func<A, A, A> faa;
Func<X, A, X> fxa;
X exx;
A exa;
public LazySegmentTree(int size, Func<X, X, X> funcxx, Func<A, A, A> funcaa, Func<X, A, X> funcxa, X exval, A exlaz)
{
n = size;
L = (n << 1) - 1;
Tree = new X[n << 1];
lazy = new A[n << 1];
fxx = funcxx;
faa = funcaa;
fxa = funcxa;
exx = exval;
exa = exlaz;
for (var i = 0; i <= L; i++) { Tree[i] = exx; lazy[i] = exa; }
}
public X eval(int id) => fxa(Tree[id], lazy[id]);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void propagate(int id)
{
int h = 0; while ((1 << (h + 1)) <= id) h++;
for (var n = h; n > 0; n--)
{
int i = id >> n;
Tree[i] = eval(i);
lazy[i << 1] = faa(lazy[i << 1], lazy[i]);
lazy[i << 1 | 1] = faa(lazy[i << 1 | 1], lazy[i]);
lazy[i] = exa;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void re_calc(int id)
{
while (id > 1)
{
id >>= 1;
Tree[id] = fxx(eval(id << 1), eval(id << 1 | 1));
}
}
public void Range_Update(int l, int r, A op)
{
int L = n + l, R = n + r;
int ll = L / (L & (-L));
int rr = R / (R & (-R));
propagate(ll); propagate(rr - 1);
while (L < R)
{
if ((L & 1) == 1)
{
lazy[L] = faa(lazy[L], op);
L++;
}
if ((R & 1) == 1)
{
R--;
lazy[R] = faa(lazy[R], op);
}
L >>= 1; R >>= 1;
}
re_calc(ll); re_calc(rr - 1);
}
public X Range_Get(int l, int r)
{
int L = n + l, R = n + r;
X vL = exx, vR = exx;
propagate(L / (L & (-L)));
propagate(R / (R & (-R)) - 1);
while (L < R)
{
if ((L & 1) == 1)
{
vL = fxx(vL, eval(L));
L++;
}
if ((R & 1) == 1)
{
R--;
vR = fxx(eval(R), vR);
}
L >>= 1; R >>= 1;
}
return fxx(vL, vR);
}
public void Point_Update(int idx, X nxt)
{
int id = idx + n;
propagate(id);
Tree[id] = nxt;
re_calc(id);
}
/*======================*/
public void Assign(int idx, X nxt) => Tree[n + idx] = nxt;
public void Set_All()
{
for (var i = n - 1; i >= 1; i--)
{
Tree[i] = fxx(Tree[i << 1], Tree[i << 1 | 1]);
lazy[i] = faa(lazy[i << 1], lazy[i << 1 | 1]);
}
}
public X Peek(int idx) => eval(idx);
public void Display(int len)
{
for (var i = n; i < n + len; i++) Console.Write($"{eval(i)} ");
Console.WriteLine();
}
public void Displayall()
{
//n2
int e = 0;
while ((1 << e) <= n)
{
for (var i = (1 << e); i < (1 << e) + (1 << e); i++) Console.Write($"{Tree[i]}/{lazy[i]} ");
Console.WriteLine();
e++;
}
}
}
public class StringTools
{
public static int[] Z_algorithm(string S)
{
int L = S.Length;
var ret = new int[L];
int i = 1, j = 0;
ret[0] = L;
while (i < L)
{
while (i + j < L && (S[i + j] == S[j])) j++;
ret[i] = j;
if (j == 0) { i++; continue; }
int k = 1;
while (i + k < L && (k + ret[k] < j))
{
ret[i + k] = ret[k];
k++;
}
i += k;
j -= k;
}
return ret;
}
}
public class Rolling_Hash
{
const ulong m30 = (1UL << 30) - 1;
const ulong m31 = (1UL << 31) - 1;
const ulong MOD = (1UL << 61) - 1;
const ulong Pl = (MOD << 1) << 1;
private uint B;
private string S;
ulong[] hash;
ulong[] pw;
public Rolling_Hash(string str)
{
S = str;
B = (uint)new Random().Next(1 << 12 + 1, int.MaxValue);
int L = S.Length;
hash = new ulong[L + 1];
pw = new ulong[L + 1];
hash[0] = 0;
pw[0] = 1;
for (var i = 0; i < L; i++)
{
hash[i + 1] = CalcMod(Mul(hash[i], B) + S[i]);
pw[i + 1] = CalcMod(Mul(pw[i], B));
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ulong GetHashValue(int idx) => hash[idx];
[MethodImpl(MethodImplOptions.AggressiveInlining)]//segment [l,r]
public ulong Hash_fold(int l, int r) => CalcMod(Pl + hash[r + 1] - Mul(hash[l], pw[r - l + 1]));
[MethodImpl(MethodImplOptions.AggressiveInlining)]//segment[start,start+len-1]
public ulong Hash_sub(int start, int len) => CalcMod(Pl + hash[start + len] - Mul(hash[start], pw[len]));
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ulong[] GetHashArray() => hash;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
ulong Mul(ulong a, ulong b)
{
ulong au = a >> 31;
ulong ad = a & m31;
ulong bu = b >> 31;
ulong bd = b & m31;
ulong mid = ad * bu + au * bd;
ulong midu = mid >> 30;
ulong midd = mid & m30;
return au * bu * 2 + midu + (midd << 31) + ad * bd;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
ulong CalcMod(ulong x)
{
ulong xu = x >> 61;
ulong xd = x & MOD;
ulong res = xu + xd;
if (res >= MOD) res -= MOD;
return res;
}
}
public class UnionFind
{
private int[] parent;
private int[] rank;
private int[] size;
public UnionFind(int n)
{
parent = new int[n];
rank = new int[n];
size = new int[n];
for (var i = 0; i < n; i++)
{
parent[i] = i;
rank[i] = 0;
size[i] = 1;
}
}
public int Root(int x)
{
return parent[x] == x ? x : parent[x] = Root(parent[x]);
}
public bool SameRoot(int x, int y)
{
return Root(x) == Root(y);
}
public void Unite(int x, int y)
{
x = Root(x);
y = Root(y);
if (x == y) { return; }
if (rank[x] < rank[y])
{
parent[x] = y;
size[y] += size[x];
size[x] = 0;
}
else
{
parent[y] = x;
if (rank[x] == rank[y]) { rank[x]++; }
size[x] += size[y];
size[y] = 0;
}
}
public int SizeOf(int x)
{
return size[Root(x)];
}
}
static class Cin
{
public static string[] ReadSplit => Console.ReadLine().Split();
public static int[] ReadSplitInt => ConvertAll(ReadSplit, int.Parse);
public static long[] ReadSplitLong => ConvertAll(ReadSplit, long.Parse);
public static double[] ReadSplit_Double => ConvertAll(ReadSplit, double.Parse);
public static string Str => Console.ReadLine();
public static int Int => int.Parse(Console.ReadLine());
public static long Long => long.Parse(Console.ReadLine());
public static double Double => double.Parse(Console.ReadLine());
public static T Conv<T>(string input)
{
if (typeof(T).Equals(typeof(ModInt)))
{
return (T)(dynamic)(long.Parse(input));
}
return (T)Convert.ChangeType(input, typeof(T));
}
public static void Scanf<T>(out T a) => a = Conv<T>(Console.ReadLine());
public static void Scanf<T, U>(out T a, out U b)
{ var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); }
public static void Scanf<T, U, V>(out T a, out U b, out V c)
{ var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); }
public static void Scanf<T, U, V, W>(out T a, out U b, out V c, out W d)
{ var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); d = Conv<W>(q[3]); }
public static void Scanf<T, U, V, W, X>(out T a, out U b, out V c, out W d, out X e)
{ var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); d = Conv<W>(q[3]); e = Conv<X>(q[4]); }
}
static class Cout
{
public static void OutL(object s) => Console.WriteLine(s);
public static void Out_Sep<T>(IEnumerable<T> s) => Console.WriteLine(string.Join(" ", s));
public static void Out_Sep<T>(IEnumerable<T> s, string sep) => Console.WriteLine(string.Join($"{sep}", s));
public static void Out_Sep(params object[] s) => Console.WriteLine(string.Join(" ", s));
public static void Out_One(object s) => Console.Write($"{s} ");
public static void Out_One(object s, string sep) => Console.Write($"{s}{sep}");
public static void Endl() => Console.WriteLine();
}
public static class Tool
{
static public void Initialize<T>(ref T[] array, T initialvalue)
{
array = ConvertAll(array, x => initialvalue);
}
static public void Swap<T>(ref T a, ref T b)
{
T keep = a;
a = b;
b = keep;
}
static public void Display<T>(T[,] array2d, int n, int m)
{
for (var i = 0; i < n; i++)
{
for (var j = 0; j < m; j++)
{
Console.Write($"{array2d[i, j]} ");
}
Console.WriteLine();
}
}
static public long Gcd(long a, long b)
{
if (a == 0 || b == 0) return Max(a, b);
return a % b == 0 ? b : Gcd(b, a % b);
}
static public long LPow(int a, int b) => (long)Pow(a, b);
static public bool Bit(long x, int dig) => ((1L << dig) & x) != 0;
static public int Sig(long a) => a == 0 ? 0 : (int)(a / Abs(a));
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0