Submission #50020474


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

using ll = long long int;
constexpr int kN = 200'000 + 10;

struct SegTree
{
    struct Node
    {
        int lIdx = -1;
        int rIdx = -1;
        ll sum = 0;
    };

    vector<Node> nodes;
    array<int, kN> roots;
    int curIdx;

    int GenNewNode()
    {
        nodes.emplace_back();
        return static_cast<int>( nodes.size() ) - 1;
    }

    int CopyNode( int idx )
    {
        nodes.emplace_back( nodes[idx] );
        return static_cast<int>( nodes.size() ) - 1;
    }

    void Init( int nodeIdx, int l, int r )
    {
        if( l < r )
        {
            nodes[nodeIdx].lIdx = GenNewNode();
            nodes[nodeIdx].rIdx = GenNewNode();

            int mid = ( l + r ) >> 1;
            Init( nodes[nodeIdx].lIdx, l, mid );
            Init( nodes[nodeIdx].rIdx, mid + 1, r );
        }

        return;
    }

    void Init( int l, int r )
    {
        curIdx = 0;
        roots[0] = GenNewNode();
        Init( roots[0], l, r );
        return;
    }

    void Add( int nodeIdx, int l, int r, int pos, ll a )
    {
        nodes[nodeIdx].sum += a;

        if( l < r ) [[likely]]
        {
            int mid = ( l + r ) >> 1;

            if( pos <= mid )
            {
                nodes[nodeIdx].lIdx = CopyNode( nodes[nodeIdx].lIdx );
                Add( nodes[nodeIdx].lIdx, l, mid, pos, a );
            }
            else
            {
                nodes[nodeIdx].rIdx = CopyNode( nodes[nodeIdx].rIdx );
                Add( nodes[nodeIdx].rIdx, mid + 1, r, pos, a );
            }
        }

        return;
    }

    void AddO( int l, int r, int pos, ll a )
    {
        curIdx++;
        roots[curIdx] = CopyNode( roots[curIdx - 1] );
        Add( roots[curIdx], l, r, pos, a );
        return;
    }

    ll Ask( int nodeLIdx, int nodeRIdx, int l, int r, int pos ) const
    {
        if( l == r )
            return nodes[nodeRIdx].sum - nodes[nodeLIdx].sum;
        else [[likely]]
        {
            int mid = ( l + r ) >> 1;

            if( pos <= mid )
                return Ask( nodes[nodeLIdx].lIdx, nodes[nodeRIdx].lIdx, l, mid, pos );
            else
                return ( nodes[nodes[nodeRIdx].lIdx].sum - nodes[nodes[nodeLIdx].lIdx].sum ) + Ask( nodes[nodeLIdx].rIdx, nodes[nodeRIdx].rIdx, mid + 1, r, pos );
        }
    }

    ll AskO( int L, int R, int l, int r, int pos ) const
    {
        return Ask( roots[L - 1], roots[R], l, r, pos );
    }

} segTree;

array<ll, kN> a, l, r, x, ans;

int main()
{
    int n; scanf( "%d", &n );
    for( int i = 1; i <= n; i++ ) scanf( "%lld", &a[i] );
    int q; scanf( "%d", &q );
    for( int i = 1; i <= q; i++ ) scanf( "%lld%lld%lld", &l[i], &r[i], &x[i] );

    vector<ll> as( n );
    for( int i = 1; i <= n; i++ ) as[i - 1] = a[i];
    sort( as.begin(), as.end() );
    as.resize( unique( as.begin(), as.end() ) - as.begin() );
    int asSz = static_cast<int>( as.size() );

    segTree.Init( 0, asSz - 1 );
    for( int i = 1; i <= n; i++ )
    {
        int aId = lower_bound( as.begin(), as.end(), a[i] ) - as.begin();
        segTree.AddO( 0, asSz - 1, aId, a[i] );
    }

    for( int i = 1; i <= q; i++ )
    {
        l[i] ^= ans[i - 1];
        r[i] ^= ans[i - 1];
        x[i] ^= ans[i - 1];
        int xId = ( upper_bound( as.begin(), as.end(), x[i] ) - as.begin() ) - 1;

        if( xId >= 0 ) [[likely]]
            ans[i] = segTree.AskO( l[i], r[i], 0, asSz - 1, xId );
    }

    for( int i = 1; i <= q; i++ ) printf( "%lld\n", ans[i] );
}

Submission Info

Submission Time
Task G - Smaller Sum
User iaNTU
Language C++ 20 (gcc 12.2)
Score 600
Code Size 3674 Byte
Status AC
Exec Time 417 ms
Memory 78436 KiB

Compile Error

Main.cpp: In function ‘int main()’:
Main.cpp:112:17: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  112 |     int n; scanf( "%d", &n );
      |            ~~~~~^~~~~~~~~~~~
Main.cpp:113:40: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  113 |     for( int i = 1; i <= n; i++ ) scanf( "%lld", &a[i] );
      |                                   ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:114:17: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  114 |     int q; scanf( "%d", &q );
      |            ~~~~~^~~~~~~~~~~~
Main.cpp:115:40: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  115 |     for( int i = 1; i <= q; i++ ) scanf( "%lld%lld%lld", &l[i], &r[i], &x[i] );
      |                                   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 1
AC × 51
Set Name Test Cases
Sample sample_01.txt
All sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 3772 KiB
test_01.txt AC 10 ms 5480 KiB
test_02.txt AC 10 ms 6540 KiB
test_03.txt AC 81 ms 17660 KiB
test_04.txt AC 77 ms 39520 KiB
test_05.txt AC 22 ms 5740 KiB
test_06.txt AC 202 ms 41508 KiB
test_07.txt AC 330 ms 76224 KiB
test_08.txt AC 354 ms 76548 KiB
test_09.txt AC 73 ms 8120 KiB
test_10.txt AC 28 ms 9612 KiB
test_11.txt AC 58 ms 11396 KiB
test_12.txt AC 55 ms 24764 KiB
test_13.txt AC 38 ms 23172 KiB
test_14.txt AC 97 ms 23740 KiB
test_15.txt AC 107 ms 23160 KiB
test_16.txt AC 238 ms 43240 KiB
test_17.txt AC 158 ms 72704 KiB
test_18.txt AC 39 ms 7280 KiB
test_19.txt AC 169 ms 40568 KiB
test_20.txt AC 43 ms 10132 KiB
test_21.txt AC 87 ms 20012 KiB
test_22.txt AC 107 ms 28148 KiB
test_23.txt AC 118 ms 28068 KiB
test_24.txt AC 219 ms 77452 KiB
test_25.txt AC 338 ms 77316 KiB
test_26.txt AC 393 ms 77896 KiB
test_27.txt AC 406 ms 78332 KiB
test_28.txt AC 407 ms 78296 KiB
test_29.txt AC 406 ms 78340 KiB
test_30.txt AC 71 ms 16596 KiB
test_31.txt AC 87 ms 19980 KiB
test_32.txt AC 107 ms 28104 KiB
test_33.txt AC 116 ms 27972 KiB
test_34.txt AC 226 ms 77488 KiB
test_35.txt AC 338 ms 77440 KiB
test_36.txt AC 395 ms 78048 KiB
test_37.txt AC 417 ms 78280 KiB
test_38.txt AC 410 ms 78300 KiB
test_39.txt AC 409 ms 78328 KiB
test_40.txt AC 70 ms 16956 KiB
test_41.txt AC 73 ms 20040 KiB
test_42.txt AC 90 ms 28160 KiB
test_43.txt AC 99 ms 28052 KiB
test_44.txt AC 184 ms 77360 KiB
test_45.txt AC 290 ms 77340 KiB
test_46.txt AC 335 ms 78012 KiB
test_47.txt AC 355 ms 78436 KiB
test_48.txt AC 346 ms 78332 KiB
test_49.txt AC 346 ms 78408 KiB
test_50.txt AC 60 ms 16572 KiB