inlinevoidget_seg() { for (int i = 0; i <= Log; ++i) { int v = V >> i; // DEBUG (v); for (int j = N; j >= 1; --j) { int p = upper_bound (A + 1, A + N + 1, A[j] + v) - A - 1; Next[j] = 0; Next[j] = max (Next[p], j); } for (int l = 1, r = 0; l <= N; l = r + 1) { r = Next[l]; L[i][++L[i][0]] = l, R[i][++R[i][0]] = r; } } }
int f[Maxs], g[Maxs];
inlinevoidget_f() { int ALL = (1 << Log) - 1; for (int i = 0; i <= ALL; ++i) { int preR = f[i]; for (int j = 1; j <= Log; ++j) { if (i & (1 << (j - 1))) continue; int x = upper_bound (L[j] + 1, L[j] + L[j][0] + 1, preR + 1) - L[j] - 1; int nowR = max (preR, R[j][x]); Chkmax (f[i | (1 << (j - 1))], nowR); } } }
inlinevoidget_g() { int ALL = (1 << Log) - 1; for (int i = 0; i <= ALL; ++i) g[i] = N + 1; for (int i = 0; i <= ALL; ++i) { int preL = g[i]; for (int j = 1; j <= Log; ++j) { if (i & (1 << (j - 1))) continue; int x = lower_bound (R[j] + 1, R[j] + R[j][0] + 1, preL - 1) - R[j]; int nowL = min (preL, L[j][x]); Chkmin (g[i | (1 << (j - 1))], nowL); } } }