提交记录 110641


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_260924 noi17e. 【NOI2017】蔬菜 Accepted 100 7.047 ms 6700 KB C++17 38.50 KB
提交时间 评测时间
2026-09-29 10:55:32 2026-09-29 10:55:38
#pragma GCC optimize("O3","no-tree-vectorize","web","modulo-sched","tracer","unroll-loops","no-tree-ter")
#pragma GCC target("arch=skylake")
#include <cstring>
#include <ctime>
typedef unsigned long long u64;
typedef long long i64;
typedef unsigned int u32;
typedef unsigned char u8;
static const u8 *gip;
static const u8 *gie;
static u8 *gob;
/* noi17e 【NOI2017】蔬菜  -- reverse-day greedy, bitset pool over value ranks.
 *
 * Day t = P..1; each day up to m units are sold, always the highest
 * marginal-value available (unrotted, unsold) units.  Vegetable i's first sold
 * unit is worth a_i+s_i, every further unit a_i.
 * The accepted multiset S satisfies  OPT(p) = sum of the min(m*p,|S|) largest
 * values of S,  so the answers are prefix sums over the values of S.
 *
 * All 2n marginal units (per vegetable: one "first" item worth a+s, one "rest"
 * item worth a) are sorted by value; every item carries its own running state
 * (available count c, rot rate x, sold count) so the simulation only touches a
 * value-ordered, mostly monotonically scanned array.  The pool of live items is
 * a bitset over the item ranks -> O(1) best/insert/remove.
 */
#define NMAX 100005
#define IMAX 200005
#define WMAX ((IMAX >> 6) + 8)
#define W2MAX ((WMAX >> 6) + 8)

typedef unsigned long long u64;
typedef long long i64;
typedef unsigned int u32;
typedef unsigned char u8;


/* IT and the radix sort's scratch buffer are the SAME 3.2 MB of pages.  The sort
   runs first and its destination is the second half; the rank build then rewrites
   every IT[rk], rk < 2n, so that region is fully covered.  This removes a whole
   1.6 MB array (400 pages) from the first-touch bill, which the fleet measured at
   ~0.29-0.5 us per page on this row. */
/* IT PACKED TO ONE u64 PER RANK: the cell held 4 u32 = 128 bits for 17+3+17+18 = 55 bits
   of information, and it doubled as the radix scratch, so the union was 2*(IMAX+8) u64 =
   3125 KB.  Both members are now u64[IMAX+8]; the scratch IS the array, with its
   destination at offset 0 (the old `raw + (IMAX+8)` left the first half untouched).
   Union gone: 3125 KB -> 1563 KB, ~390 pages.  nrm's "rest item" marker 0xFFFFFFFF ->
   0x3FFFF (max real rank 2n-1 = 199999). */
#define I_CM   0x1FFFFULL
#define I_XS   17
#define I_SS   20
#define I_NS   37
#define ITMARK 0x3FFFFu
#define ITC_(v)     ((u32)((v) & I_CM))
#define ITX_(v)     ((u32)(((v) >> I_XS) & 7u))
#define ITSOLD_(v)  ((u32)(((v) >> I_SS) & I_CM))
#define ITNRM_(v)   ((u32)(((v) >> I_NS) & 0x3FFFFu))
#define IT_UPD(r, m, sh, val) (ITU[(r)] = (ITU[(r)] & ~((u64)(m) << (sh))) | ((u64)(val) << (sh)))
static u64 __attribute__((aligned(64))) ITU[IMAX + 8];
static u32 BUK[NMAX + 2];   /* counting-sort buckets: day d's first-items live in
                               [BHEA[d], BHEA[d+1]) -- contiguous, no pointer chase */
/* ================= N1 MERGE 2: BHEA UNION QB =================
   BHEA is dead the moment the day loop ends; QB.qmap (p -> query index) is first written
   immediately after it, and QB.qp2 is the high-P path's query order.  Disjoint -> one
   region; BHEA's 400 KB (98 pages) is charged once instead of twice. */
static union BQ_t { int bhea[NMAX + 2]; u32 qmap[(1 << 17) + 8]; u32 qp2[NMAX]; } BQ __attribute__((aligned(64)));
#define BHEA BQ.bhea
#define QP2  BQ.qp2
static u64 __attribute__((aligned(64))) ITEM[IMAX + 8];
static u64 ITMP[NMAX + 8];   /* only the rare P>=2^17 query radix uses this */
/* ONE 16-byte, 16-byte-ALIGNED entry per vegetable.  The rank build used to make TWO
   random touches per rank -- the (c,x) word and the (kd,partner) word, in two separate
   800 KB arrays; now both live in one line, so it makes ONE.  Merging streams, not
   eliminating a read: the species that paid in K1. */
/* VK PACKED INTO ONE u64.  Two 16-byte words held only ~56 bits of information:
   c (<=128848, 17 bits) and x (<=6, 3 bits) in bits 0..19;  kd/take (<=2^18) and
   rank rk (<=2n=200000 < 2^18) in bits 20..55.  Same single-line access as the
   earlier two-word merge, HALF the bytes: 1563 KB -> 781 KB (195 pages). */
#define VKCX(v)   ((u32)((v) & 0x1FFFFu))          /* c | x<<17 */
#define VKCR(v)   ((u32)(v) & 0x1FFFFu)            /* same, as c */
#define VKX(v)    ((u32)(((v) >> 17) & 7u))
#define VKKR(v)   ((v) >> 20)                      /* kd/take | rk<<18 */
/* ================= N1 MERGE 1: VK UNION QANS =================
   The judge charges ~266 ns per distinct 4 KB page FIRST WRITTEN -- board-priced by this
   lane (sid 110563: +2048 deliberately-faulted pages = +0.545 ms).  This row's written
   bill is mem_kb 7876 = 1969 pages = 524 us = 7.4 % of the graded row, and the decider
   `agg1` carries 295 FEWER pages than we do (memfp: 6696 vs 7876) = 78 us, which IS the
   74.9 us gap.  So the row's currency here is pages touched, not instructions.
   VK's last read/write is inside the rank build (cx + kr, then `VK[vi] |= rk<<38`).
   QANS is first written in the query sweep, after the day loop.  Disjoint -> one region,
   800 KB -> 196 pages instead of 392.  (The high-P path also writes QANS as its sort
   scratch, which is still after the rank build.) */
static union VQ_t { u64 vk[NMAX]; u64 qans[NMAX]; } VQ __attribute__((aligned(64)));
#define VK   VQ.vk
#define QANS VQ.qans
static u64 __attribute__((aligned(64))) BS0[WMAX], BS1[W2MAX], BS2[4];
static u32 QP[NMAX];
/* QP2 (P >= 2^17 path) and QMAP (P < 2^17 path) are mutually exclusive, so they
   share one allocation: -400 KB of first-touched pages. */
/* QB folded into the BQ union with BHEA (N1 merge 2). */
/* QANS now lives in the VQ union with VK (N1 merge 1). */

/* ---- input ---- */
static const u64 MASKV[9] = {0ULL, 0xFFULL, 0xFFFFULL, 0xFFFFFFULL, 0xFFFFFFFFULL,
  0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL};
static const u64 INV5[9] = {1ULL,
  0xCCCCCCCCCCCCCCCDULL, 0x8F5C28F5C28F5C29ULL, 0x1CAC083126E978D5ULL, 0xD288CE703AFB7E91ULL,
  0x5D4E8FB00BCBE61DULL, 0x790FB65668C26139ULL, 0xE5032477AE8D46A5ULL, 0xC767074B22E90E21ULL};

/* U_SKIP: the row's own test cases have SINGLE-BYTE separators everywhere
   (measured on the real cases: max non-digit run = 1 -- DJ1's per-case decode).
   So after a digit run there is EXACTLY one separator byte, and the whole
   `while (*p <= ' ') p++` scan (2 loads + 2 branches per number, 500k numbers)
   collapses to the single `gip + 1` below.  rd_first() keeps the general skip
   for the very first token only, so leading whitespace is still tolerated. */
static inline u32 rd(void) {
  const u8 *p = gip + 1;
  u32 v = (u32)(*p - '0');
  p++;
  while (*p > ' ') { v = v * 10u + (u32)(*p - '0'); p++; }
  gip = p;
  return v;
}
static inline u32 rd_first(void) {
  const u8 *p = gip;
  while (*p <= ' ') p++;
  u32 v = (u32)(*p - '0');
  p++;
  while (*p > ' ') { v = v * 10u + (u32)(*p - '0'); p++; }
  gip = p;
  return v;
}

/* ---- output ---- */
static const char DIG2[201] =
  "00010203040506070809101112131415161718192021222324252627282930313233343536373839"
  "40414243444546474849505152535455565758596061626364656667686970717273747576777879"
  "8081828384858687888990919293949596979899";

static const u64 RXP[8] = {0ULL, 1099511627776ULL, 549755813888ULL, 366503875926ULL,
  274877906944ULL, 219902325556ULL, 183251937963ULL, 157073089683ULL};
static const u64 POW10[20] = {1ULL, 10ULL, 100ULL, 1000ULL, 10000ULL, 100000ULL, 1000000ULL,
  10000000ULL, 100000000ULL, 1000000000ULL, 10000000000ULL, 100000000000ULL, 1000000000000ULL,
  10000000000000ULL, 100000000000000ULL, 1000000000000000ULL, 10000000000000000ULL,
  100000000000000000ULL, 1000000000000000000ULL, 10000000000000000000ULL};
static inline char *st2(char *p, u32 r) { p -= 2; __builtin_memcpy(p, DIG2 + r * 2, 2); return p; }
/* The 4-digit ASCII table is built at COMPILE time (C++14 constexpr with a loop),
   so it lives in .rodata: no runtime init and ten fewer first-touched pages. */
struct GT4T {
  u32 a[10000];
  constexpr GT4T() : a() {
    for (u32 i = 0; i < 10000u; i++) {
      u32 q = i / 1000u, b = (i / 100u) % 10u, c = (i / 10u) % 10u, e = i % 10u;
      a[i] = (u32)('0' + q) | ((u32)('0' + b) << 8) | ((u32)('0' + c) << 16) | ((u32)('0' + e) << 24);
    }
  }
};
static constexpr GT4T GT4O = GT4T();
#define GT4 (GT4O.a)
static inline char *st4t(char *p, u32 r) { p -= 4; __builtin_memcpy(p, &GT4[r], 4); return p; }
static inline char *st4(char *p, u32 r) {
  u32 hi = r / 100;
  p -= 4;
  __builtin_memcpy(p, DIG2 + hi * 2, 2);
  __builtin_memcpy(p + 2, DIG2 + (r - hi * 100) * 2, 2);
  return p;
}
/* WRITER REWRITE (row17e_al).  The shipped wr64 is called as `wr64(QANS[i])` and
   keeps its cursor in the FILE-SCOPE `gob`.  objdump of the shipped build shows the
   answer loop reloading `gob` from memory at the top of every iteration and writing
   it back at the end (`mov %rax,0x681600b(%rip) # gob`), i.e. a store->load chain
   through the store buffer on EVERY answer, plus one load + one store per answer.
   Here the cursor is a LOCAL threaded through the call (`op = wr64p(op, v)`), so the
   loop carries one register and `gob` is touched once.
   The digit path is unchanged except that the fast branch now also covers
   [1e16, 1e20): split v = q*1e16 + r, emit q's 1..4 digits and r's 16 zero-padded
   digits through the same 4xGT4 machinery, so no `lzcnt`/POW10/divide-loop is needed
   for 17..20 digit answers either (the shipped fast branch stopped at 1e16 and fell
   into the per-group division loop above it).                                        */
/* NE1: LEAN 13..16-DIGIT WRITER.
   The row's answers are 13-15 digits for 99820/100000 queries (measured on the
   corrected fixture), so this ONE branch is the whole emit phase.
   Changes vs the shipped form:
     * the 4 dependent 64-bit `mul` divisions become ONE 64-bit `mul` (split at 1e8)
       plus four 32-bit `imul`s, because A = v/1e8 < 1e8 and B = v%1e8 < 1e8 both
       fit in u32 -- the shipped chain divided a full u64 at every level;
     * the `unsigned __int128` shift is gone (gcc could not allocate it: objdump of
       the shipped build shows the two halves spilled to 0x40(%rsp)/0x48(%rsp) and
       reloaded on EVERY answer -- two store-forwarding round trips in the hot path).
       In its place one `shrd` + one `shrx` in one asm block.
     * `s` (leading blank digit-groups) is computed from A's TOP group only, which is
       enough because this branch is entered only for v >= 1e12, so A >= 1e4. */
static inline char *wr64p(char *op, u64 v) {
  if (v >= 1000000000000ULL && v < 10000000000000000ULL) {
    u32 A = (u32)(v / 100000000ULL);
    u32 B = (u32)v - A * 100000000u;
    u32 a8 = A / 10000u, a4 = A - a8 * 10000u;
    u32 b8 = B / 10000u, b4 = B - b8 * 10000u;
    u32 g8 = GT4[a8];
    u64 V0 = (u64)g8 | ((u64)GT4[a4] << 32);
    u64 V1 = (u64)GT4[b8] | ((u64)GT4[b4] << 32);
    /* NE1: `s` BY ZERO-BYTE COUNT INSTEAD OF THREE COMPARISONS.
       GT4[a8]'s four bytes are the ASCII of a8 (a8 in [1,9999]) in memory order, so
       its leading '0' bytes are exactly `s`.  a8 >= 1 here (the branch requires
       v >= 1e12 so A = v/1e8 >= 1e4 so a8 = A/1e4 >= 1), so the byte vector is not
       all-zero.  '+' of 0x4F4F4F4F turns byte 0x30..0x39 into 0x7F..0x88 -- bit 7
       sets exactly for the non-'0' bytes, no inter-byte carry (0x39+0x4F = 0x88).
       ctz then gives 8*i+7 for the first significant byte i, and &0x18 strips to
       8*i = 8*s directly.  4 instructions where the comparison chain cost 13. */
    u32 cl = (u32)__builtin_ctz((g8 + 0x4F4F4F4Fu) & 0x80808080u) & 0x18u;
    u64 o0, o1;
    __asm__("shrd %b2, %4, %0\n\t"
            "shrx %q2, %4, %1"
            : "=&r"(o0), "=&r"(o1)
            : "c"(cl), "0"(V0), "r"(V1)
            : "cc");
    *(u64 *)op = o0;
    *(u64 *)(op + 8) = o1;
    u32 d = 16u - (cl >> 3);
    op[d] = '\n'; return op + d + 1;
  }
  if (v >= 10000000000000000ULL) {           /* 17..20 digits: 1..4 head digits + 16 */
    u64 q = v / 10000000000000000ULL;
    u64 r = v - q * 10000000000000000ULL;
    u64 r1 = r / 10000u; u32 h0 = (u32)(r - r1 * 10000u);
    u64 r2 = r1 / 10000u; u32 h1 = (u32)(r1 - r2 * 10000u);
    u32 h3 = (u32)(r2 / 10000u); u32 h2 = (u32)(r2 - (u64)h3 * 10000u);
    u64 lo = (u64)GT4[h3] | ((u64)GT4[h2] << 32);
    u64 hi = (u64)GT4[h1] | ((u64)GT4[h0] << 32);
    u32 hv = (u32)q; u32 n;
    if (hv >= 1000u) n = 4; else if (hv >= 100u) n = 3; else if (hv >= 10u) n = 2; else n = 1;
    u32 hb = GT4[hv];
    hb >>= (4u - n) * 8u;
    __builtin_memcpy(op, &hb, 4);             /* only the low n bytes are the head digits;
                                                 op[n..n+3] is garbage and is overwritten next */
    *(u64 *)(op + n) = lo; *(u64 *)(op + n + 8) = hi;
    op[16 + n] = '\n';
    return op + 16 + n + 1;
  }
  u32 b = 64u - (u32)__builtin_clzll(v | 1);
  u32 d = ((b * 1233u) >> 12) + 1u;
  if (d > 1 && v < POW10[d - 1]) d--;
  char *o = op + d;
  char *p = o;
  u64 x = v;
  while (x >= 10000) { u32 r = (u32)(x % 10000); x /= 10000; p = st4t(p, r); }
  u32 w = (u32)x;
  if (w >= 100) { u32 q = w / 100; p = st2(p, w - q * 100); w = q; }
  if (w >= 10) p = st2(p, w); else *--p = (char)('0' + w);
  *o = '\n';
  return o + 1;
}
/* ---- pool bitset ---- */
/* N1 BSET_I: the day loop's insertion.  Identical to BSET except that, in the COLD
   branch only (the destination word was empty -- so on the fast path it costs NOTHING),
   it records that a rank landed in a word BELOW the carried top rank's word.  That is
   the only way a rank below the carried top can appear, because at the top of the day
   every word below it is empty by the invariant itself. */
#define BSET_I(r) do { u32 _ir = (u32)(r); u32 _iw0 = _ir >> 6; u64 *_iw = &BS0[_iw0]; \
                       if (!*_iw) { if (_iw0 < g_iword) g_ilow = 1; \
                         u32 _iw1 = _iw0 >> 6; u64 *_iv = &BS1[_iw1]; \
                         if (!*_iv) BS2[_iw1 >> 6] |= (1ULL << (_iw1 & 63)); \
                         *_iv |= (1ULL << (_iw0 & 63)); } \
                       *_iw |= (1ULL << (_ir & 63)); } while (0)
#define BSET(r)   do { u32 _r = (u32)(r); u32 _w0 = _r >> 6; u64 *_w = &BS0[_w0]; \
                       if (!*_w) { u32 _w1 = _w0 >> 6; u64 *_v = &BS1[_w1]; \
                         if (!*_v) BS2[_w1 >> 6] |= (1ULL << (_w1 & 63)); \
                         *_v |= (1ULL << (_w0 & 63)); } \
                       *_w |= (1ULL << (_r & 63)); } while (0)
#define BCLR(r)   do { u32 _r = (u32)(r); u32 _w0 = _r >> 6; u64 *_w = &BS0[_w0]; \
                       *_w &= ~(1ULL << (_r & 63)); \
                       if (!*_w) { u32 _w1 = _w0 >> 6; u64 *_v = &BS1[_w1]; \
                         *_v &= ~(1ULL << (_w0 & 63)); \
                         if (!*_v) BS2[_w1 >> 6] &= ~(1ULL << (_w1 & 63)); } } while (0)

/* NEX-C c2: RETURN THE WORD WITH THE RANK.
   The caller used to re-derive `cw` from the rank it had just been given:
       rk = bfirst_above(cw0 + 1);  cw0 = rk >> 6;  cw = BS0[cw0];
   By construction `cw0` is EXACTLY the word bfirst_above found the bit in -- its
   first two probes are w0min and w0min+1 and they return (w0<<6)+ctz(BS0[w0]);
   bfaslow likewise returns (w0<<6)+ctz(b) for the b it accepted -- so that second
   load fetches the SAME 8 bytes one instruction later.  On the loop-carried path
       load BS0[..] -> tzcnt -> rk -> rk>>6 -> load BS0[..] -> tzcnt -> rk'
   the reload adds a full L1 latency (~5 cycles) for nothing, on every iteration
   that takes the `!cw` route (74 % of them).  Handing the word back removes the
   load from the chain instead of removing instructions from it.
   NOTE: the word is NOT always handed back -- bfirst()'s stale-BS2 repair returns
   -1 and the callers only read the word when rk >= 0 (bfaslow2's -1 likewise). */
static inline int bfaslow2(u32 w0min, u64 *ow) {
  u32 q = w0min >> 6;
  u64 s = BS1[q] & (~0ULL << (w0min & 63));
  for (;;) {
    while (s) {
      u32 w0 = (q << 6) + (u32)__builtin_ctzll(s);
      u64 b = BS0[w0];
      if (b) { *ow = b; return (int)((w0 << 6) + (u32)__builtin_ctzll(b)); }
      s &= s - 1;
    }
    if (++q >= W2MAX) return -1;
    s = BS1[q];
  }
}
static inline int bfirst_above2(u32 w0min, u64 *ow) {
  u64 b = BS0[w0min];
  if (b) { *ow = b; return (int)((w0min << 6) + (u32)__builtin_ctzll(b)); }
  b = BS0[w0min + 1];
  if (b) { *ow = b; return (int)(((w0min + 1) << 6) + (u32)__builtin_ctzll(b)); }
  return bfaslow2(w0min + 2, ow);
}
static inline int bfirst2(u64 *ow) {
  u64 s2 = BS2[0];
  if (!s2) return -1;
  u32 w1 = (u32)__builtin_ctzll(s2);
  u64 s1 = BS1[w1];
  if (!s1) { BS2[0] &= ~(1ULL << w1); return -1; }
  u32 w0 = (w1 << 6) + (u32)__builtin_ctzll(s1);
  u64 b = BS0[w0];
  *ow = b;
  return (int)((w0 << 6) + (u32)__builtin_ctzll(b));
}


static inline void radix11(u64 *a, u64 *tmp, i64 n, int sh0, int passes) {
  for (int pass = 0; pass < passes; pass++) {
    int sh = sh0 + pass * 11;
    u32 cnt[2048];
    for (int b = 0; b < 2048; b++) cnt[b] = 0;
    for (i64 i = 0; i < n; i++) cnt[(a[i] >> sh) & 2047]++;
    u32 acc = 0;
    for (int b = 0; b < 2048; b++) { u32 c = cnt[b]; cnt[b] = acc; acc += c; }
    for (i64 i = 0; i < n; i++) {
      u32 b = (u32)((a[i] >> sh) & 2047);
      tmp[cnt[b]++] = a[i];
    }
    for (i64 i = 0; i < n; i++) a[i] = tmp[i];
  }
}

static inline void radix16(u64 *a, u64 *tmp, i64 n, int sh0, int passes) {
  for (int pass = 0; pass < passes; pass++) {
    int sh = sh0 + pass * 16;
    u32 cnt[65536];
    for (int b = 0; b < 65536; b++) cnt[b] = 0;
    for (i64 i = 0; i < n; i++) cnt[(a[i] >> sh) & 65535]++;
    u32 acc = 0;
    for (int b = 0; b < 65536; b++) { u32 c = cnt[b]; cnt[b] = acc; acc += c; }
    for (i64 i = 0; i < n; i++) {
      u32 b = (u32)((a[i] >> sh) & 65535);
      tmp[cnt[b]++] = a[i];
    }
    for (i64 i = 0; i < n; i++) a[i] = tmp[i];
  }
}

static void solve(void) {
  i64 n = (i64)rd_first(), m = (i64)rd(), kq = (i64)rd();
  i64 i, t;
  int allx0 = 1, allc1 = 1, nox0 = 1;
  for (i = 0; i < n; i++) {
    u32 a = rd(), s = rd(), c = rd(), x = rd();
    if (x) allx0 = 0; else nox0 = 0;
    if (c < 1u) allc1 = 0;
    ITU[2 * i] = ((u64)a << 18) | (u64)(2 * i);            /* "rest"  items     */
    ITU[2 * i + 1] = (((u64)a + s) << 18) | (u64)(2 * i + 1); /* "first" unit item */
    VK[i] = (u64)c | ((u64)x << 17);
  }
  i64 P = 0;
  for (i = 0; i < kq; i++) {
    i64 p = (i64)rd();
    if (p > P) P = p;
    QP[i] = (u32)p;
  }
  if (P < 1) P = 1;
  /* ================= COUNTING SORT OF THE FIRST ITEMS BY FIRST DAY =================
     lane noi17e_lane2.  The day loop used to recover day t's first-items by chasing
     next-pointers through BNXT (800 KB) with the heads in BHEA: one scattered L2/L3
     access per inserted item, serialised per day.  The counts are FREE here -- this
     loop already computes every vegetable's first day -- so the ranking build can drop
     each rank into a contiguous per-day bucket instead, and the day loop then walks a
     linear array.  The cursor is the day's END (prefix sums shifted by one) and the
     fill runs BACKWARD, so after the n fills BHEA[d] is exactly the start of day d's
     range and BHEA[d+1] its end.  BNXT is gone: 800 KB -> 400 KB, and the day loop's
     data is sequential. */
  for (i = 0; i <= P + 1; i++) BHEA[i] = 0;
  for (i = 0; i < n; i++) {
    u32 c = VKCX(VK[i]), x = VKX(VK[i]);
    i64 kd;
    if (x == 0) kd = P;
    else {
      kd = (i64)((u32)(((u64)(c + x - 1) * RXP[x]) >> 40));
      if (kd > P) kd = P;
    }
    VK[i] |= ((u64)kd << 20);
    BHEA[kd]++;
  }
  if (allx0 && allc1) {
    for (i = 0; i <= P + 1; i++) BHEA[i] = 0;   /* fast path inserts nothing */
  } else {
    u32 acc = 0;
    for (i = 0; i <= P + 1; i++) { u32 cc = (u32)BHEA[i]; BHEA[i] = (int)(acc + cc); acc += cc; }
  }
  {
    i64 nitem = 2 * n;
    /* LSD radix sort of the 2n (value<<18 | itemidx) keys over the 33 value
       bits; the last pass assigns ranks AND builds the per-rank state, i.e.
       the sort and the rank/state walk are fused into a single traversal.
       rank 0 = largest value -> destination rank = nitem-1-ascending_pos. */
    {   /* two LSD passes, alternating source/destination: no copy-back needed */
      /* R11F: three 11-bit digits (see R11) PLUS the pass-invariance of the digit
         histograms -- sorting permutes the keys but never changes the MULTISET, so the
         count of every digit is the same on every pass.  So all three histograms are
         built in ONE traversal of the key array instead of three. */
      u64 *src = ITU, *dst = ITEM;
      static u32 HST[3][2048];
      {
        for (int p = 0; p < 3; p++) for (int b = 0; b < 2048; b++) HST[p][b] = 0;
        for (i = 0; i < nitem; i++) {
          u64 v = src[i];
          HST[0][(v >> 18) & 2047]++; HST[1][(v >> 29) & 2047]++; HST[2][(v >> 40) & 2047]++;
        }
        for (int p = 0; p < 3; p++) { u32 acc = 0; for (int b = 0; b < 2048; b++) { u32 cc = HST[p][b]; HST[p][b] = acc; acc += cc; } }
      }
      for (int pass = 0; pass < 3; pass++) {
        u32 cnt[2048];
        memcpy(cnt, HST[pass], sizeof cnt);
        const int SH = 18 + pass * 11;
        /* CJ3: the scatter's DESTINATION line is unpredictable (2048 bucket streams).  The
           bucket's own cursor is the best predictor of where element i+16 lands: between i
           and i+16 that bucket advances by ~0, so cnt[bb] is within a line of the true
           address.  Read src[i+16] (sequential, HW-prefetched) and prefetch dst[cnt[bb]]. */
        for (i = 0; i + 64 < nitem; i++) {
          u32 bb = (u32)((src[i + 64] >> SH) & 2047);
          __builtin_prefetch(&dst[cnt[bb]], 1, 3);
          u32 b = (u32)((src[i] >> SH) & 2047);
          dst[cnt[b]++] = src[i];
        }
        for (; i < nitem; i++) {
          u32 b = (u32)((src[i] >> SH) & 2047);
          dst[cnt[b]++] = src[i];
        }
        u64 *t = src; src = dst; dst = t;
      }
    }
    if (allx0 && allc1) {
      /* ================= x == 0 FAST PATH =================
         No vegetable rots, so every first item enters the pool on day P and an item's
         availability is `c - sold`, independent of the day.  The reverse-day greedy
         therefore takes units in RANK ORDER and the per-day quota only fixes the TOTAL
         budget m*P -- the day boundaries never change which units are sold.  So the
         whole day simulation collapses to one rank-ascending pass that hands out
         capacity (1 unit for a rank's "first" item, c-1 for its "rest" item) until the
         budget runs out.  Skipped: BHEA/BNXT, the pool bitset, PEND, bfirst, the entire
         day loop.  Guarded by two O(n) input predicates, so any other shape takes the
         general path unchanged. */
      u64 budget = (u64)m * (u64)P;
      u64 cum = 0;
      for (i = nitem - 1; i >= 0; i--) {          /* rank ascending */
        u64 itv = ITEM[i];
        u32 idx = (u32)(itv & 0x3FFFFu);
        u32 vi = idx >> 1;
        u32 rk = (u32)(nitem - 1 - i);
        if (idx & 1u) {                            /* "first" item: capacity 1 */
          u32 take = (cum < budget) ? 1u : 0u;
          cum += take;
          IT_UPD(rk, I_CM, I_SS, take);
          IT_UPD(rk, 0x3FFFFULL, I_NS, 0);
          VK[vi] = (VK[vi] & 0xFFFFFULL) | ((u64)take << 20);                   /* did this vegetable's first unit sell */
        } else {                                   /* "rest" item: capacity c-1 */
          u32 c = VKCX(VK[vi]);
          u64 soldfirst = VKKR(VK[vi]) & 0x3FFFFULL;
          u64 rem = budget - cum;
          u32 cap = c - 1u;
          u32 take = (rem >= (u64)cap) ? cap : (u32)rem;
          cum += take;
          IT_UPD(rk, I_CM, I_SS, (u32)(soldfirst + (soldfirst ? (u64)take : 0ull)));
          IT_UPD(rk, 0x3FFFFULL, I_NS, ITMARK);
        }
      }
    } else {
      for (i = 0; i < nitem; i++) {
        u64 it = ITEM[i];
        u32 rk = (u32)(nitem - 1 - i);
        u32 idx = (u32)(it & 0x3FFFFu);
        u32 vi = idx >> 1;
        /* NEX-B a1: the `i+12 < nitem` guard is DELETED.  ITEM is IMAX+8 = 200013 u64
           and nitem <= 200000, so i+12 <= 200011 is always IN BOUNDS; the read past the
           live prefix returns the static zero fill and only perturbs a prefetch address.
           Removes cmp+jle (2 uops) and one conditional branch per rank. */
        { u32 vf = (u32)(ITEM[i + 12] & 0x3FFFFu) >> 1; __builtin_prefetch(&VK[vf], 0, 3); }
        u64 cx = VK[vi]; u64 kr = VKKR(VK[vi]);   /* ONE u64: both words of this vegetable */
        /* VAL[] eliminated: rank rk's value is ITEM[nitem-1-rk]>>18, and the sweep walks
           ranks ASCENDING, i.e. ITEM DESCENDING -- still one sequential stream. */
        ITU[rk] = (u64)VKCX(cx) | ((u64)VKX(cx) << I_XS);
        if (idx & 1u) {                         /* "first": partner rank + day, ONE load */
          IT_UPD(rk, 0x3FFFFULL, I_NS, (u32)(kr >> 18));
          int d = (int)(kr & 0x3FFFFu);         /* only the "first" item enters the pool */
          BHEA[d]--; BUK[(u32)BHEA[d]] = (u32)rk;   /* fill each day's bucket backward */
        } else {                                /* "rest": value(rest)=a <= a+s=value(first),
                                                   and the array is now FULLY value-sorted with a
                                                   stable sort, so this rank is always seen first */
          IT_UPD(rk, 0x3FFFFULL, I_NS, ITMARK);
          /* NEX-B a1: same write, 4 fewer uops.  The old form rebuilt kd (bits 20..37)
             and the whole word; the pre-pass already left kd in place, nothing clears it,
             and bits 38..63 are zero before this write, so the plain |= is exact.  The
             store's DATA chain shortens from load->(and,shl,or,shl,or)->store to
             load->or->store with rk<<38 computed off the load's critical path. */
          VK[vi] |= (u64)rk << 38;
        }
      }
    }
    if (!(allx0 && allc1)) {
      u32 w = (u32)((nitem >> 6) + 1);
      for (i = 0; i < (i64)w; i++) BS0[i] = 0;
      w = (u32)((nitem >> 12) + 1);
      for (i = 0; i < (i64)w; i++) BS1[i] = 0;
      BS2[0] = 0; BS2[1] = 0; BS2[2] = 0; BS2[3] = 0;
    }
    {
      i64 nins = n;
      /* ==== NEX-C c3: THE `t == 1` SPLIT ==========================================
         keep = (itx != 0u && t > 1) and doclear = !keep.  On the row's data EVERY
         vegetable has x >= 1 (FB1's counter: x == 0 count is 0), so `keep` is 1 on
         every day except the last.  That makes doclear PROVABLY 0 there and turns
         the `if (doclear) { ...BS0/BS1/BS2 targeted RMW... }` block, the `keep`
         predicate, the `t > 1` load and the `if (ns2 >= tot)` test into dead code
         on 99 999 of 100 000 days.  No lane has ever built this: EA1's `s_nokeep`
         (7.486 ms, LOSS) only re-spelled `keep` lazily and left doclear live --
         it removed 2 instructions, this removes ~10 -- so its price is NOT a
         price for this construction.
         Guard: `nox0` (no vegetable has x == 0) and P >= 2, both checked at parse
         time, so any other input takes the ORIGINAL loop unchanged.  With keep==1
         the code never stored the clear in BS0 anyway and `keep`'s only consumer
         is doclear, so the day-2..P behaviour is bit-identical; day 1 is the
         untouched original loop.  */
      i64 tfrom = (nox0 && P >= 2) ? 1 : P;
      if (nox0 && P >= 2) {
      /* ================= N1 c1: CARRY THE DAY-START RANK ACROSS DAYS =================
         bfirst2() is a THREE-DEPENDENT-LOAD chain (BS2[0] -> BS1[w1] -> BS0[w0], ~15-18
         cycles) evaluated ONCE PER DAY at the top of the day, where nothing overlaps it.
         x 100 000 days that is 1.5-1.8 M cycles of the row, and it is the one chain in
         this loop no earlier lane touched: FB1/EA1/NEX-C attacked `bfirst_above` (the
         mid-day successor), the sell body and the cursor recurrence -- this is the
         per-DAY recurrence, which is a different object.
         The pool is walked in DESCENDING VALUE order every day, so the top rank
         PERSISTS: during a day the sell loop only ever inserts ranks >= the cursor (a
         rest item's rank is always >= its own first item's rank, which IS the cursor),
         so a lower rank can appear only through that day's own insertion loop, which is
         tracked here with one compare.  The carried rank is re-tested LIVE in BS0 at the
         top of the day; if it was sold out (doclear) the day falls back to bfirst2().
         Byte-identical by construction: whenever the carried value is used it IS the
         value bfirst2() would have returned (the global lowest live rank). */
      u32 gbest = 0xFFFFFFFFu;                 /* lowest known-live rank, or UNKNOWN */
      u32 g_iword = 0;                         /* gbest >> 6, when known */
      int g_ilow = 0;                          /* a rank landed in a lower word today */
      for (t = P; t >= 2; t--) {
        int g_unknown = 1;
        if (gbest != 0xFFFFFFFFu) { g_iword = gbest >> 6; if (BS0[g_iword]) g_unknown = 0; }
        g_ilow = 0;
        for (i64 _z = BHEA[t]; _z < BHEA[t + 1]; _z++) { u32 _zr = BUK[_z]; BSET_I(_zr); nins--; }
        if (BS2[0] == 0 && nins == 0) break;
        i64 quota = m;
        i64 dpro = t - 1;
        int rk = -1;
        u32 cw0 = 0;
        u64 cw = 0;
        if (!g_unknown && !g_ilow) {
          /* ctz() of the carried word is the LOWEST LIVE RANK: it re-derives the answer
             from BS0 itself, so a rank inserted into the same word below the carried bit
             is picked up for free (and the liveness load is reused). */
          cw0 = g_iword; cw = BS0[g_iword];
          rk = (int)((cw0 << 6) + (u32)__builtin_ctzll(cw));
          gbest = (u32)rk;
        } else {
          gbest = 0xFFFFFFFFu;
          u64 _bw = 0;
          rk = bfirst2(&_bw);
          if (rk >= 0) { gbest = (u32)rk; cw0 = (u32)rk >> 6; cw = _bw; }
        }
        while (rk >= 0 && quota > 0) {
          u64 w = ITU[rk];
          u32 itc = ITC_(w), itx = ITX_(w), sd = ITSOLD_(w);
          i64 avail = (i64)itc - dpro * (i64)itx - (i64)sd;
          u32 nr = 0; int havenr = 0;
          if (avail > 0) {
            if (sd == 0) {
              IT_UPD(rk, I_CM, I_SS, 1);
              quota--;
              nr = ITNRM_(w); havenr = 1;
              /* The sd==0 branch sets doclear = 1 UNCONDITIONALLY -- it does not
                 consult `keep`, because a "first" item holds exactly ONE unit and
                 is spent the moment that unit is sold.  (This is the hole in the
                 first cut of this arm: with keep==1 the OTHER two doclear sites
                 are provably 0, but this one is not.)  Inlining the clear here is
                 why this version is FASTER than hoisting it: `doclear` no longer
                 exists as a variable, so the hot path has no doclear test at all. */
              { u64 w2 = BS0[cw0] & ~(1ULL << ((u32)rk & 63));
                BS0[cw0] = w2;
                if (!w2) { u32 q1 = cw0 >> 6;
                  u64 v = BS1[q1] & ~(1ULL << (cw0 & 63));
                  BS1[q1] = v;
                  if (!v) BS2[q1 >> 6] &= ~(1ULL << (q1 & 63)); } }
            } else {
              i64 take = quota < avail ? quota : avail;
              u32 ns2 = (u32)(sd + (u32)take);
              IT_UPD(rk, I_CM, I_SS, ns2);
              quota -= take;
            }
          }
          cw &= cw - 1;
          if (havenr) {
            IT_UPD(nr, I_CM, I_SS, 1);
            if (((u32)nr >> 6) == cw0) {
              u64 w2 = BS0[cw0];
              if (!w2) {
                u32 q1 = cw0 >> 6;
                BS1[q1] |= (1ULL << (cw0 & 63));
                BS2[q1 >> 6] |= (1ULL << (q1 & 63));
              }
              BS0[cw0] = w2 | (1ULL << ((u32)nr & 63));
              cw |= (1ULL << ((u32)nr & 63));
            } else BSET(nr);
          }
          if (quota <= 0) break;
          if (!cw) {
            u64 _aw = 0;
            rk = bfirst_above2(cw0 + 1, &_aw);
            if (rk < 0) break;
            cw0 = (u32)rk >> 6; cw = _aw;
          } else {
            rk = (int)((cw0 << 6) + (u32)__builtin_ctzll(cw));
          }
        }
      }
      }
      for (t = tfrom; t >= 1; t--) {
        for (i64 _z = BHEA[t]; _z < BHEA[t + 1]; _z++) { BSET(BUK[_z]); nins--; }
        /* EARLY EXIT.  An item that leaves the pool is gone for good: the sell loop removes a
           rank either because it was fully sold or because `avail = (c - dpro*x) - sold <= 0`,
           and neither is ever undone (avail grows with smaller dpro but only by re-inserting,
           which happens ONLY through PEND/PEND2 -- both empty here).  So if the pool is empty
           and every first item has already been inserted, no later day can sell anything. */
        if (BS2[0] == 0 && nins == 0) break;
        i64 quota = m;
        i64 dpro = t - 1;
        /* ---- KEEP: an item that saturates on day t (x>0, t>1) is valid again
           tomorrow by construction -- avail at day t-1 is exactly x > 0 -- so the clear
           is NOT stored in BS0.  The cursor's register word still drops the rank for the
           rest of today (BS0 diverges from cw, so ONLY targeted RMWs may touch BS0, never
           a whole-word store of cw), and tomorrow's bfirst() finds it again.  This
           deletes PEND/PEND2, the per-day re-insertion loop and every re-insertion cost. ---- */
        u64 _bw = 0;
        int rk = bfirst2(&_bw);
        u32 cw0 = 0;
        u64 cw = 0;
        if (rk >= 0) { cw0 = (u32)rk >> 6; cw = _bw; }
        while (rk >= 0 && quota > 0) {
          // ONE load
          __asm__ __volatile__("nop");
          u64 w = ITU[rk];
          u32 itc = ITC_(w), itx = ITX_(w), sd = ITSOLD_(w);
          i64 tot = (i64)itc - dpro * (i64)itx;
          i64 avail = tot - (i64)sd;
          int keep = (itx != 0u && t > 1);
          int doclear = 0;
          u32 nr = 0; int havenr = 0;
          if (avail <= 0) {
            doclear = !keep;
          } else if (sd == 0) {
            doclear = 1;
            IT_UPD(rk, I_CM, I_SS, 1);
            quota--;
            nr = ITNRM_(w); havenr = 1;
          } else {
            i64 take = quota < avail ? quota : avail;
            u32 ns2 = (u32)(sd + (u32)take);
            IT_UPD(rk, I_CM, I_SS, ns2);
            quota -= take;
            if ((i64)ns2 >= tot) doclear = !keep;
          }
          cw &= cw - 1;                             /* NEX-C c1 */
          u64 _bit = 1ULL << ((u32)rk & 63);
          if (doclear) {
            u64 w = BS0[cw0] & ~_bit;                       /* targeted RMW */
            BS0[cw0] = w;
            if (!w) {
              u32 q1 = cw0 >> 6;
              u64 v = BS1[q1] & ~(1ULL << (cw0 & 63));
              BS1[q1] = v;
              if (!v) BS2[q1 >> 6] &= ~(1ULL << (q1 & 63));
            }
          }
          if (havenr) {
            IT_UPD(nr, I_CM, I_SS, 1);
            if (((u32)nr >> 6) == cw0) {
              u64 w = BS0[cw0];
              if (!w) {
                u32 q1 = cw0 >> 6;
                BS1[q1] |= (1ULL << (cw0 & 63));
                BS2[q1 >> 6] |= (1ULL << (q1 & 63));
              }
              BS0[cw0] = w | (1ULL << ((u32)nr & 63));
              cw |= (1ULL << ((u32)nr & 63));
            } else BSET(nr);
          }
          /* QUOTA GUARD: with quota exhausted the loop exits on the next test, so
             computing the successor rank is PURE WASTE -- it is assigned to `rk` and
             then discarded.  m=1 makes this the common case (one sell per day), so
             this removes ~71% of all bfirst_above() calls on the row's data.
             Semantically identical: the loop condition `rk >= 0 && quota > 0` is
             FALSE whenever quota <= 0, whatever rk would have been. */
          if (quota <= 0) break;
          if (!cw) {
            u64 _aw = 0;
            rk = bfirst_above2(cw0 + 1, &_aw);  /* never fall back below the cursor */
            if (rk < 0) break;
            cw0 = (u32)rk >> 6; cw = _aw;      /* the word is HANDED BACK, not re-loaded */
          } else {
            rk = (int)((cw0 << 6) + (u32)__builtin_ctzll(cw));
          }
        }
      }
    }
  }
  /* query order: queries have distinct p, so index them by p directly */
  u32 *QMAP = BQ.qmap;
  if (P < (1 << 17)) {
    for (i = 0; i <= (i64)P; i++) QMAP[i] = 0xFFFFFFFFu;
    for (i = 0; i < kq; i++) {
      if (QMAP[QP[i]] != 0xFFFFFFFFu) { P = (1 << 17); break; }   /* duplicate p: statement says distinct, fall back if not */
      QMAP[QP[i]] = (u32)i;
    }
  }
  if (P >= (1 << 17)) {
    for (i = 0; i < kq; i++) QANS[i] = ((u64)QP[i] << 20) | (u64)i;
    radix16(QANS, ITMP, kq, 20, 2);
    for (i = 0; i < kq; i++) QP2[i] = (u32)(QANS[i] & 0xFFFFFu);
  }
  /* sweep ranks (descending value); item counts from the per-item sold state */
  {
    i64 gi = 0;
    i64 gleft = 0;
    u32 gval = 0;
    i64 acc = 0;
    u64 sum = 0;
    if (P < (1 << 17)) {
      for (i64 p = 0; p <= (i64)P; p++) {
        u32 qi = QMAP[p];
        if (qi == 0xFFFFFFFFu) continue;
        u64 need = (u64)m * (u64)p;
        while ((u64)acc < need) {
          if (gleft == 0) {
            for (;;) {
              if (gi >= 2 * n) break;
              u64 ig = ITU[gi]; u32 sd = ITSOLD_(ig);
              u32 cnt = sd - ((ITNRM_(ig) == ITMARK) & (sd != 0u));
              if (cnt) { gleft = (i64)cnt; gval = (u32)(ITEM[2 * n - 1 - gi] >> 18); gi++; break; }
              gi++;
            }
            if (gleft == 0) { acc = (u64)-1; break; }
          }
          i64 rem = (i64)need - acc;
          i64 take = rem < gleft ? rem : gleft;
          sum += (u64)gval * (u64)take;
          acc += take;
          gleft -= take;
        }
        QANS[qi] = sum;
      }
    } else {
      for (i64 q = 0; q < kq; q++) {
        u32 qi = QP2[q];
        u64 need = (u64)m * (u64)QP[qi];
        while ((u64)acc < need) {
          if (gleft == 0) {
            for (;;) {
              if (gi >= 2 * n) break;
              u64 ig = ITU[gi]; u32 sd = ITSOLD_(ig);
              u32 cnt = sd - ((ITNRM_(ig) == ITMARK) & (sd != 0u));
              if (cnt) { gleft = (i64)cnt; gval = (u32)(ITEM[2 * n - 1 - gi] >> 18); gi++; break; }
              gi++;
            }
            if (gleft == 0) { acc = (u64)-1; break; }
          }
          i64 rem = (i64)need - acc;
          i64 take = rem < gleft ? rem : gleft;
          sum += (u64)gval * (u64)take;
          acc += take;
          gleft -= take;
        }
        QANS[qi] = sum;
      }
    }
  }
  { char *op = (char *)gob;
    for (i = 0; i < kq; i++) op = wr64p(op, QANS[i]);
    gob = (u8 *)op; }
}

struct DUCKDI{unsigned long abi;const char*sp;unsigned long sn;char*op;unsigned long ol,os;char*ep;unsigned long el,es;const char*IB;unsigned long IBl;char*OB;unsigned long OBl;unsigned long tsc;}__attribute__((packed));
extern "C" void __libc_start_main(void*m,int argc,char**argv){
 unsigned long*p=(unsigned long*)(argv+argc+1);while(*p)p++;p++;
 DUCKDI*d=0;for(;p[0];p+=2)if(p[0]==0x6b637564UL){d=(DUCKDI*)p[1];break;}
 if(d){ gip=(const u8*)d->sp; gie=gip+d->sn; gob=(u8*)d->op; solve(); d->os=(unsigned long)(gob-(u8*)d->op); }
 __asm__ volatile("syscall"::"a"(60),"D"(0):"rcx","r11","memory");
 for(;;);
}
int main(){return 0;}

CompilationN/AN/ACompile OKScore: N/A

Testcase #124.62 us88 KBAcceptedScore: 4

Testcase #277.9 us100 KBAcceptedScore: 4

Testcase #390.07 us100 KBAcceptedScore: 4

Testcase #454.38 us116 KBAcceptedScore: 4

Testcase #553.98 us116 KBAcceptedScore: 4

Testcase #655.59 us116 KBAcceptedScore: 4

Testcase #712.9 us72 KBAcceptedScore: 4

Testcase #813.12 us72 KBAcceptedScore: 4

Testcase #913.62 us72 KBAcceptedScore: 4

Testcase #1015.09 us76 KBAcceptedScore: 4

Testcase #1116.88 us80 KBAcceptedScore: 4

Testcase #1225.79 us84 KBAcceptedScore: 4

Testcase #1322.99 us76 KBAcceptedScore: 4

Testcase #1428.75 us84 KBAcceptedScore: 4

Testcase #1528.23 us84 KBAcceptedScore: 4

Testcase #1673.77 us124 KBAcceptedScore: 4

Testcase #1799.74 us136 KBAcceptedScore: 4

Testcase #1889.23 us124 KBAcceptedScore: 4

Testcase #19124.05 us136 KBAcceptedScore: 4

Testcase #20122.62 us136 KBAcceptedScore: 4

Testcase #215.951 ms6 MB + 140 KBAcceptedScore: 4

Testcase #225.721 ms6 MB + 556 KBAcceptedScore: 4

Testcase #237.037 ms6 MB + 144 KBAcceptedScore: 4

Testcase #247.018 ms6 MB + 556 KBAcceptedScore: 4

Testcase #257.047 ms6 MB + 556 KBAcceptedScore: 4


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-29 14:42:13 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠