Submission #868111

# Submission time Handle Problem Language Result Execution time Memory
868111 2023-10-30T12:45:43 Z sleepntsheep Segments (IZhO18_segments) C++17
16 / 100
855 ms 9928 KB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,tune=native")

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define N 200005
int V;

int n, t, na, nc, S, id = 1;
struct line { int l, r, w; } a[N], c[N], o[N];
int e[N], f[N], we[N], wf[N], pf_[N], sz[N], *pf = pf_+1;

int compare_length(const void *a0, const void *b0)
{
    const struct line *a = (const struct line*)a0, *b = (const struct line*)b0;
    if (a->r - a->l != b->r - b->l) return ((a->r - a->l) - (b->r - b->l));
    if (a->l != b->l) return a->l - b->l;
    return a->w - b->w;
}

int compare_left_increasing_index(const void *a0, const void *b0)
{
    const int aa = *(const int*)a0, bb = *(const int*)b0;
    if (a[aa].l != a[bb].l) return a[aa].l - a[bb].l;
    if (a[aa].r != a[bb].r) return a[aa].r - a[bb].r;
    return a[aa].w - a[bb].w;
}

int compare_right_increasing_index(const void *a0, const void *b0)
{
    const int aa = *(const int*)a0, bb = *(const int*)b0;
    if (a[aa].r != a[bb].r) return a[aa].r - a[bb].r;
    if (a[aa].l != a[bb].l) return a[aa].l - a[bb].l;
    return a[aa].w - a[bb].w;
}

inline void rebuild()
{
    for (; nc;) a[na++] = c[--nc];
    qsort(a, na, sizeof *a, compare_length);
    memset(sz, 0, sizeof *sz * (na / V + 1));
    for (int i = 0; i < na; ++i) e[i] = f[i] = i, ++sz[i/V];
    pf[0] = a[0].w;
    for (int i = 1; i < na; ++i) pf[i] = pf[i-1] + a[i].w;
    for (int i = 0; i * V <= na; ++i)
    {
        qsort(e+i*V, sz[i], sizeof *e, compare_left_increasing_index);
        qsort(f+i*V, sz[i], sizeof *f, compare_right_increasing_index);

        we[i*V+sz[i]-1] = a[e[i*V+sz[i]-1]].w;
        for (int j = i*V+sz[i]-1; --j >= i*V;) we[j] = we[j+1] + a[e[j]].w;
        wf[i*V] = a[f[i*V]].w;
        for (int j = i*V+1; j < i*V+sz[i]; ++j) wf[j] = wf[j-1] + a[f[j]].w;
    }
}

int main(void)
{
    scanf("%d%d", &n, &t);
    V = sqrt(n * log2(n));

    for (int z = 0, lastans = 0, op, x, y, k, l, r; n--;)
    {
        scanf("%d%d", &op, &x);
        switch (op)
        {
            case 1:
                scanf("%d", &y);
                l = x ^ (t * lastans), r = y ^ (t * lastans);
                if (l>r) { int t=l;l=r;r=t;}
                o[id++] = c[nc++] = (struct line){l, r, 1};
                if (nc == V) rebuild();
                ++S;
                break;
            case 2:
                c[nc++] = (struct line){o[x].l, o[x].r, -1};
                if (nc == V) rebuild();
                --S;
                break;
            default:
                scanf("%d%d", &y, &k); z=0;
                l = x ^ (t * lastans), r = y ^ (t * lastans);
                if (l>r) { int t=l;l=r;r=t;}
                /* count in static */
                {
                    int Z = -1;
                    for (int L = 0, R = na-1; L <= R; )
                    {
                        int M = (L+R)/2;
                        if (a[M].r - a[M].l + 1 >= k) R = M - 1, Z = M;
                        else L = M + 1;
                    }
                    if (Z != -1)
                    {
                        z -= pf[Z-1];
                        int zb = Z/V, sb = zb+1;
                        for (struct line *j = a + Z; j < a + sb * V; ++j) z -= (j->r < l + k - 1 || j->l > r - k + 1) * j->w;
                        for (int j = sb; j * V <= na; ++j)
                        {
                            /* r - j->l + 1 < k === j->l > r - k + 1 */
                            int cnt = 0;
                            for (int L = 0, R = sz[j]-1; L <= R;)
                            {
                                int M = (L+R)/2;
                                if (a[e[j*V+M]].l > r - k + 1) R = M - 1, cnt = we[j*V+M];
                                else L = M + 1;
                            }
                            z -= cnt;
                            cnt = 0;
                            /* j->r - l + 1 < k === j->l < k + l - 1 */
                            for (int L = 0, R = sz[j]-1; L <= R;)
                            {
                                int M = (L+R)/2;
                                if (a[f[j*V+M]].r < k + l - 1) L = M + 1, cnt = wf[j*V+M];
                                else R = M - 1;
                            }
                            z -= cnt;
                        }
                    }
                }

                /* count in buffer */
                for (struct line *j = c; j < c + nc; ++j) z -= (j->r < l + k - 1 || j->l > r - k + 1) * j->w;
                lastans = (z += S);
                printf("%d\n", z);
                break;
        }
    }
    return 0;
}

Compilation message

segments.cpp: In function 'int main()':
segments.cpp:62:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |     scanf("%d%d", &n, &t);
      |     ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:67:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |         scanf("%d%d", &op, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:71:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |                 scanf("%d", &y);
      |                 ~~~~~^~~~~~~~~~
segments.cpp:84:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |                 scanf("%d%d", &y, &k); z=0;
      |                 ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 8540 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Incorrect 6 ms 8684 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 507 ms 9164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 480 ms 9792 KB Output is correct
2 Correct 485 ms 9620 KB Output is correct
3 Correct 479 ms 9488 KB Output is correct
4 Correct 500 ms 9380 KB Output is correct
5 Correct 730 ms 9396 KB Output is correct
6 Correct 676 ms 9232 KB Output is correct
7 Correct 693 ms 9324 KB Output is correct
8 Correct 845 ms 9632 KB Output is correct
9 Correct 855 ms 9616 KB Output is correct
10 Correct 813 ms 9552 KB Output is correct
11 Correct 516 ms 9476 KB Output is correct
12 Correct 819 ms 9584 KB Output is correct
13 Correct 738 ms 9584 KB Output is correct
14 Correct 609 ms 9484 KB Output is correct
15 Correct 584 ms 9524 KB Output is correct
16 Correct 554 ms 9644 KB Output is correct
17 Correct 590 ms 9276 KB Output is correct
18 Correct 591 ms 9124 KB Output is correct
19 Correct 586 ms 9212 KB Output is correct
20 Correct 594 ms 9156 KB Output is correct
21 Correct 547 ms 9532 KB Output is correct
22 Correct 692 ms 9532 KB Output is correct
23 Correct 749 ms 9544 KB Output is correct
24 Correct 705 ms 9808 KB Output is correct
25 Correct 483 ms 9500 KB Output is correct
26 Correct 486 ms 9412 KB Output is correct
27 Correct 486 ms 9592 KB Output is correct
28 Correct 480 ms 9420 KB Output is correct
29 Correct 762 ms 9620 KB Output is correct
30 Correct 759 ms 9840 KB Output is correct
31 Correct 844 ms 9620 KB Output is correct
32 Correct 792 ms 9660 KB Output is correct
33 Correct 758 ms 9612 KB Output is correct
34 Correct 593 ms 9928 KB Output is correct
35 Correct 690 ms 9496 KB Output is correct
36 Correct 756 ms 9480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 451 ms 9460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 8540 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Incorrect 6 ms 8684 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 8540 KB Output is correct
2 Correct 1 ms 8540 KB Output is correct
3 Incorrect 6 ms 8684 KB Output isn't correct
4 Halted 0 ms 0 KB -