이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <stdio.h>
#include <sys/time.h>
#define N 250000
#define M 250000
#define Q 250000
#define N_ (1 << 18) /* N_ = pow2(ceil(log2(Q + 1))) */
long long min(long long a, long long b) { return a < b ? a : b; }
unsigned int X = 12345;
int rand_() {
return (X *= 3) >> 1;
}
int xx[Q * 2], hh[Q * 2];
int tt[Q], ll[Q], rr[Q], ii[Q], cc[Q], ans[Q]; long long kk[Q];
void sort(int *hh, int l, int r) {
while (l < r) {
int i = l, j = l, k = r, h = hh[l + rand_() % (r - l)], tmp;
while (j < k)
if (xx[hh[j]] == xx[h])
j++;
else if (xx[hh[j]] < xx[h]) {
tmp = hh[i], hh[i] = hh[j], hh[j] = tmp;
i++, j++;
} else {
k--;
tmp = hh[j], hh[j] = hh[k], hh[k] = tmp;
}
sort(hh, l, i);
l = k;
}
}
long long sta[N_ * 2], stb[N_ * 2], stab[N_ * 2]; int n_;
void pul(int i) {
int l = i << 1, r = l | 1;
sta[i] = sta[l] + sta[r];
stb[i] = stb[l] + stb[r];
stab[i] = min(stab[l] + stb[r], sta[l] + stab[r]);
}
void update(int i, long long a, long long b) {
i += n_;
sta[i] += a, stb[i] += b, stab[i] = min(sta[i], stb[i]);
while (i > 1)
pul(i >>= 1);
}
void query_lr(int r, long long *a_, long long *ab_) {
int l;
long long a, b, ab;
a = 0, b = 0, ab = 0;
for (l = 0 + n_, r += n_; l <= r; l >>= 1, r >>= 1)
if ((r & 1) == 0)
ab = min(sta[r] + ab, stab[r] + b), a += sta[r], b += stb[r], r--;
*a_ = a, *ab_ = ab;
}
int query_i(long long a) {
int i = 1;
while (i < n_)
if (a <= sta[i << 1 | 0])
i = i << 1 | 0;
else
a -= sta[i << 1 | 0], i = i << 1 | 1;
return i - n_;
}
int main() {
int n, m, q, h;
scanf("%d%*d%d", &n, &q);
for (h = 0; h < q; h++) {
scanf("%d", &tt[h]);
if (tt[h] == 1)
scanf("%d%d%d%lld", &ll[h], &rr[h], &cc[h], &kk[h]), ll[h]--, rr[h]--;
else if (tt[h] == 2)
scanf("%d%d%lld", &ll[h], &rr[h], &kk[h]), ll[h]--, rr[h]--;
else
scanf("%d%lld", &ii[h], &kk[h]), ii[h]--;
}
m = 0;
for (h = 0; h < q; h++)
if (tt[h] != 3)
xx[hh[m++] = h << 1 | 0] = ll[h] * 3 + 0, xx[hh[m++] = h << 1 | 1] = rr[h] * 3 + 2;
else
xx[hh[m++] = h << 1 | 0] = ii[h] * 3 + 1;
sort(hh, 0, m);
n_ = 1;
while (n_ <= q)
n_ <<= 1;
for (h = 0; h < m; h++) {
int h_ = hh[h], h1 = h_ >> 1;
long long l, r;
if (tt[h1] == 1)
update(h1, (h_ & 1) == 0 ? kk[h1] : -kk[h1], 0);
else if (tt[h1] == 2)
update(h1, 0, (h_ & 1) == 0 ? kk[h1] : -kk[h1]);
else {
query_lr(h1, &r, &l);
if (kk[h1] <= r - l)
ans[h1] = cc[query_i(l + kk[h1])];
}
}
for (h = 0; h < q; h++)
if (tt[h] == 3)
printf("%d\n", ans[h]);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
foodcourt.c: In function 'main':
foodcourt.c:81:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
81 | scanf("%d%*d%d", &n, &q);
| ^~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.c:83:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
83 | scanf("%d", &tt[h]);
| ^~~~~~~~~~~~~~~~~~~
foodcourt.c:85:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
85 | scanf("%d%d%d%lld", &ll[h], &rr[h], &cc[h], &kk[h]), ll[h]--, rr[h]--;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.c:87:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
87 | scanf("%d%d%lld", &ll[h], &rr[h], &kk[h]), ll[h]--, rr[h]--;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.c:89:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
89 | scanf("%d%lld", &ii[h], &kk[h]), ii[h]--;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |