#include <stdio.h>
#define N 200000
#define K 2000
#define M ((N + K - 1) / K)
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
unsigned int X = 12345;
int rand_() {
return (X *= 3) >> 1;
}
int ll[N], rr[N], ss[N], n;
int compare_l(int i, int j) { return ll[i] - ll[j]; }
int compare_r(int i, int j) { return rr[i] - rr[j]; }
int ii1[M], iii[M][K * 2], iiil[M][K * 2], iiir[M][K * 2], kk[M];
int (*compare)(int, int);
void sort(int *ii, int l, int r) {
while (l < r) {
int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;
while (j < k) {
int c = compare(ii[j], i_);
if (c == 0)
j++;
else if (c < 0) {
tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
i++, j++;
} else {
k--;
tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
}
}
sort(ii, l, i);
l = k;
}
}
void build() {
static int ii_[N];
int n_, g, h, l, r;
n_ = 0;
for (g = 0; g < M; g++)
for (h = 0; h < kk[g]; h++)
ii_[n_++] = iii[g][h];
for (g = 0; g < M; g++) {
l = min(g * K, n_), r = min((g + 1) * K, n_), kk[g] = r - l;
for (h = 0; h < kk[g]; h++)
iii[g][h] = iiil[g][h] = iiir[g][h] = ii_[l + h];
ii1[g] = kk[g] == 0 ? -1 : ii_[l];
compare = compare_l, sort(iiil[g], 0, kk[g]);
compare = compare_r, sort(iiir[g], 0, kk[g]);
}
}
void add(int l, int r) {
int g, h, i;
i = n++;
ll[i] = l, rr[i] = r, ss[i] = r - l + 1;
for (g = 1; g < M; g++)
if (ii1[g] == -1 || ss[i] < ss[ii1[g]])
break;
g--;
for (h = kk[g]; h > 0 && ss[i] < ss[iii[g][h - 1]]; h--)
iii[g][h] = iii[g][h - 1];
iii[g][h] = i;
for (h = kk[g]; h > 0 && ll[i] < ll[iiil[g][h - 1]]; h--)
iiil[g][h] = iiil[g][h - 1];
iiil[g][h] = i;
for (h = kk[g]; h > 0 && rr[i] < rr[iiir[g][h - 1]]; h--)
iiir[g][h] = iiir[g][h - 1];
iiir[g][h] = i;
kk[g]++;
}
void remove_(int i) {
int g, h;
for (g = 1; g < M; g++)
if (ii1[g] == -1 || ss[i] < ss[ii1[g]] || ss[i] == ss[ii1[g]] && i < ii1[g])
break;
g--;
for (h = 0; h < kk[g]; h++)
if (iii[g][h] == i) {
while (h + 1 < kk[g])
iii[g][h] = iii[g][h + 1], h++;
break;
}
for (h = 0; h < kk[g]; h++)
if (iiil[g][h] == i) {
while (h + 1 < kk[g])
iiil[g][h] = iiil[g][h + 1], h++;
break;
}
for (h = 0; h < kk[g]; h++)
if (iiir[g][h] == i) {
while (h + 1 < kk[g])
iiir[g][h] = iiir[g][h + 1], h++;
break;
}
kk[g]--;
}
int query(int l, int r, int s) {
int g, h, i, cnt, lower, upper;
if (r - l + 1 < s)
return 0;
cnt = 0;
for (g = M - 1; g >= 0; g--)
if (ii1[g] == -1 || ss[ii1[g]] >= s) {
cnt += kk[g];
lower = -1, upper = kk[g];
while (upper - lower > 1) {
h = (lower + upper) / 2;
if (r - ll[iiil[g][h]] + 1 >= s)
lower = h;
else
upper = h;
}
cnt -= kk[g] - upper;
lower = -1, upper = kk[g];
while (upper - lower > 1) {
h = (lower + upper) / 2;
if (rr[iiir[g][h]] - l + 1 >= s)
upper = h;
else
lower = h;
}
cnt -= upper;
} else {
for (h = 0; h < kk[g]; h++) {
i = iii[g][h];
if (min(rr[i], r) - max(ll[i], l) + 1 >= s)
cnt++;
}
break;
}
return cnt;
}
int main() {
int q, online, h, i, ans;
scanf("%d%d", &q, &online);
ans = 0;
for (h = 0; h < q; h++) {
int t, l, r, s, tmp;
if (h % K == 0)
build();
scanf("%d", &t);
if (t == 1) {
scanf("%d%d", &l, &r);
if (online)
l ^= ans, r ^= ans;
if (l > r)
tmp = l, l = r, r = tmp;
add(l, r);
} else if (t == 2) {
scanf("%d", &i), i--;
remove_(i);
} else {
scanf("%d%d%d", &l, &r, &s);
if (online)
l ^= ans, r ^= ans;
if (l > r)
tmp = l, l = r, r = tmp;
printf("%d\n", ans = query(l, r, s));
}
}
return 0;
}
Compilation message
segments.c: In function 'remove_':
segments.c:90:65: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
90 | if (ii1[g] == -1 || ss[i] < ss[ii1[g]] || ss[i] == ss[ii1[g]] && i < ii1[g])
| ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
segments.c: In function 'main':
segments.c:155:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
155 | scanf("%d%d", &q, &online);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
segments.c:162:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
162 | scanf("%d", &t);
| ^~~~~~~~~~~~~~~
segments.c:164:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
164 | scanf("%d%d", &l, &r);
| ^~~~~~~~~~~~~~~~~~~~~
segments.c:171:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
171 | scanf("%d", &i), i--;
| ^~~~~~~~~~~~~~~
segments.c:174:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
174 | scanf("%d%d%d", &l, &r, &s);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Incorrect |
3 ms |
340 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1031 ms |
2724 KB |
Output is correct |
2 |
Correct |
1033 ms |
4984 KB |
Output is correct |
3 |
Correct |
1037 ms |
5072 KB |
Output is correct |
4 |
Correct |
1045 ms |
5100 KB |
Output is correct |
5 |
Correct |
898 ms |
5772 KB |
Output is correct |
6 |
Correct |
850 ms |
5852 KB |
Output is correct |
7 |
Correct |
1036 ms |
4936 KB |
Output is correct |
8 |
Correct |
1053 ms |
5020 KB |
Output is correct |
9 |
Correct |
1006 ms |
5028 KB |
Output is correct |
10 |
Correct |
716 ms |
4372 KB |
Output is correct |
11 |
Correct |
811 ms |
4472 KB |
Output is correct |
12 |
Correct |
1073 ms |
5488 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
54 ms |
700 KB |
Output is correct |
2 |
Correct |
42 ms |
792 KB |
Output is correct |
3 |
Correct |
76 ms |
784 KB |
Output is correct |
4 |
Correct |
43 ms |
716 KB |
Output is correct |
5 |
Correct |
957 ms |
2920 KB |
Output is correct |
6 |
Correct |
928 ms |
2624 KB |
Output is correct |
7 |
Correct |
934 ms |
2708 KB |
Output is correct |
8 |
Correct |
865 ms |
3460 KB |
Output is correct |
9 |
Correct |
853 ms |
3516 KB |
Output is correct |
10 |
Correct |
836 ms |
2768 KB |
Output is correct |
11 |
Correct |
251 ms |
932 KB |
Output is correct |
12 |
Correct |
850 ms |
2800 KB |
Output is correct |
13 |
Correct |
806 ms |
2508 KB |
Output is correct |
14 |
Correct |
567 ms |
1740 KB |
Output is correct |
15 |
Correct |
529 ms |
1508 KB |
Output is correct |
16 |
Correct |
424 ms |
1316 KB |
Output is correct |
17 |
Correct |
844 ms |
2388 KB |
Output is correct |
18 |
Correct |
865 ms |
2408 KB |
Output is correct |
19 |
Correct |
845 ms |
2324 KB |
Output is correct |
20 |
Correct |
850 ms |
2312 KB |
Output is correct |
21 |
Correct |
286 ms |
1240 KB |
Output is correct |
22 |
Correct |
668 ms |
1848 KB |
Output is correct |
23 |
Correct |
758 ms |
2228 KB |
Output is correct |
24 |
Correct |
673 ms |
1904 KB |
Output is correct |
25 |
Correct |
58 ms |
716 KB |
Output is correct |
26 |
Correct |
46 ms |
720 KB |
Output is correct |
27 |
Correct |
59 ms |
696 KB |
Output is correct |
28 |
Correct |
54 ms |
784 KB |
Output is correct |
29 |
Correct |
784 ms |
2352 KB |
Output is correct |
30 |
Correct |
791 ms |
2328 KB |
Output is correct |
31 |
Correct |
848 ms |
3372 KB |
Output is correct |
32 |
Correct |
834 ms |
2748 KB |
Output is correct |
33 |
Correct |
807 ms |
2572 KB |
Output is correct |
34 |
Correct |
526 ms |
1576 KB |
Output is correct |
35 |
Correct |
738 ms |
2288 KB |
Output is correct |
36 |
Correct |
823 ms |
2628 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
44 ms |
716 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Incorrect |
3 ms |
340 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
0 ms |
212 KB |
Output is correct |
3 |
Incorrect |
3 ms |
340 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |