Submission #868117

# Submission time Handle Problem Language Result Execution time Memory
868117 2023-10-30T12:56:39 Z sleepntsheep Segments (IZhO18_segments) C++17
0 / 100
505 ms 10024 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;
struct line { int l, r, w; } a[N], c[99000], o[N];
int e[N], f[N], we[N], wf[N], pf_[N], sz[99000], *pf = pf_+1;

inline int max(int a, int b)  { return b>a?b:a; }
inline int min(int a, int b)  { return b<a?b:a; }

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

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

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

inline void rebuild()
{
    for (; nc;) a[na++] = c[--nc];
    qsort(a, na, sizeof *a, compare_length);
    memset(sz, 0, sizeof sz);
    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 id = 1, S, 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, cnt = 0; j * V <= na; ++j)
                        {
                            /* r - j->l + 1 < k === j->l > r - k + 1 */
                            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 -= (min(j->r, r) - max(j->l, l) + 1 < k) * j->w;
                printf("%d\n", lastans = (z += S));
                break;
        }
    }
    return 0;
}

Compilation message

segments.cpp: In function 'int main()':
segments.cpp:59:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |     scanf("%d%d", &n, &t);
      |     ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |         scanf("%d%d", &op, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:68:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |                 scanf("%d", &y);
      |                 ~~~~~^~~~~~~~~~
segments.cpp:81:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |                 scanf("%d%d", &y, &k); z=0;
      |                 ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:123:45: warning: 'S' may be used uninitialized in this function [-Wmaybe-uninitialized]
  123 |                 printf("%d\n", lastans = (z += S));
      |                                          ~~~^~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 8792 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 505 ms 9528 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 464 ms 10024 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 443 ms 9812 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 8792 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 8792 KB Output isn't correct
2 Halted 0 ms 0 KB -