Submission #834539

#TimeUsernameProblemLanguageResultExecution timeMemory
834539rainboyProgression (NOI20_progression)C11
50 / 100
3035 ms46560 KiB
#include <stdio.h> #define N 300000 #define N_ (1 << 19) /* N_ = pow2(ceil(log2(N + 2))) */ int max(int a, int b) { return a > b ? a : b; } int kk[N_ * 2]; long long ss[N_ * 2]; long long aap[N_ * 2]; int kkp[N_ * 2]; long long aaq[N_ * 2]; int kkq[N_ * 2]; int kk_[N_ * 2]; char tz[N_]; long long lz[N_]; int h_, n_; void put(int i, int t, long long x) { if (t == 1) { ss[i] += x * kk[i], aap[i] += x, aaq[i] += x; if (tz[i] == 0) tz[i] = 1; if (i < n_) lz[i] += x; } else { ss[i] = x * kk[i]; aap[i] = x, kkp[i] = kk[i]; aaq[i] = x, kkq[i] = kk[i]; kk_[i] = kk[i]; if (i < n_) tz[i] = 2, lz[i] = x; } } void pus(int i) { if (tz[i]) put(i << 1 | 0, tz[i], lz[i]), put(i << 1 | 1, tz[i], lz[i]), tz[i] = lz[i] = 0; } void pul(int i) { if (!tz[i]) { int l = i << 1, r = l | 1; ss[i] = ss[l] + ss[r]; aap[i] = aap[l], kkp[i] = kkp[l] < kk[l] || aap[l] != aap[r] ? kkp[l] : kk[l] + kkp[r]; aaq[i] = aaq[r], kkq[i] = kkq[r] < kk[r] || aaq[l] != aaq[r] ? kkq[r] : kkq[l] + kk[r]; kk_[i] = max(kk_[l], kk_[r]); if (aaq[l] == aap[r]) kk_[i] = max(kk_[i], kkq[l] + kkp[r]); } } void push(int i) { int h; for (h = h_; h > 0; h--) pus(i >> h); } void pull(int i) { while (i > 1) pul(i >>= 1); } void build(int *aa, int n) { int i, a; h_ = 0; while (1 << h_ <= n + 1) h_++; n_ = 1 << h_; for (i = 0; i <= n; i++) { a = (i == n ? 0 : aa[i]) - (i == 0 ? 0 : aa[i - 1]); kk[n_ + i] = 1; ss[n_ + i] = a; aap[n_ + i] = a, kkp[n_ + i] = 1; aaq[n_ + i] = a, kkq[n_ + i] = 1; kk_[n_ + i] = 1; } for (i = n_ - 1; i > 0; i--) kk[i] = kk[i << 1 | 0] + kk[i << 1 | 1], pul(i); } void update(int l, int r, int t, long long x) { int l_ = l += n_, r_ = r += n_; push(l_), push(r_); for ( ; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) put(l++, t, x); if ((r & 1) == 0) put(r--, t, x); } pull(l_), pull(r_); } long long query_s(int r) { int l; long long s; push(r += n_); s = 0; for (l = 0 + n_; l <= r; l >>= 1, r >>= 1) if ((r & 1) == 0) s += ss[r--]; return s; } int query_k_(int l, int r) { long long aq, ap; int kq, kp, k_; push(l += n_), push(r += n_); aq = 0, kq = 0, ap = 0, kp = 0, k_ = 0; for ( ; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) { k_ = max(k_, kk_[l]); if (aq == aap[l]) k_ = max(k_, kq + kkp[l]); kq = kkq[l] < kk[l] || aq != aaq[l] ? kkq[l] : kq + kkq[l], aq = aaq[l]; l++; } if ((r & 1) == 0) { k_ = max(kk_[r], k_); if (aaq[r] == ap) k_ = max(k_, kkq[r] + kp); kp = kkp[r] < kk[r] || aap[r] != ap ? kkp[r] : kkp[r] + kp, ap = aap[r]; r--; } } if (aq == ap) k_ = max(k_, kq + kp); return k_; } int main() { static int aa[N]; int n, q, i; scanf("%d%d", &n, &q); for (i = 0; i < n; i++) scanf("%d", &aa[i]); build(aa, n); while (q--) { int t, l, r, a, b; long long dl, dr; scanf("%d%d%d", &t, &l, &r), l--, r--; if (t == 1) { scanf("%d%d", &b, &a); update(l, l, 1, b); if (l < r) update(l + 1, r, 1, a); update(r + 1, r + 1, 1, -((long long) a * (r - l) + b)); } else if (t == 2) { scanf("%d%d", &b, &a); dl = b - (l == 0 ? 0 : query_s(l - 1)); dr = (r + 1 == n ? 0 : query_s(r + 1)) - ((long long) a * (r - l) + b); update(l, l, 2, dl); if (l < r) update(l + 1, r, 2, a); update(r + 1, r + 1, 2, dr); } else printf("%d\n", l == r ? 1 : query_k_(l + 1, r) + 1); } return 0; }

Compilation message (stderr)

Progression.c: In function 'main':
Progression.c:138:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  138 |  scanf("%d%d", &n, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~
Progression.c:140:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |   scanf("%d", &aa[i]);
      |   ^~~~~~~~~~~~~~~~~~~
Progression.c:146:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  146 |   scanf("%d%d%d", &t, &l, &r), l--, r--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Progression.c:148:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |    scanf("%d%d", &b, &a);
      |    ^~~~~~~~~~~~~~~~~~~~~
Progression.c:154:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |    scanf("%d%d", &b, &a);
      |    ^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...