Submission #1275382

#TimeUsernameProblemLanguageResultExecution timeMemory
1275382pqhxappleMonkey and Apple-trees (IZhO12_apple)C++20
100 / 100
258 ms137360 KiB
#include <bits/stdc++.h>

using namespace std;

#define FOR(i,a,b)      for (int i = (a), _b = (b); i <= (_b); ++i)
#define FORD(i,a,b)     for (int i = (a), _b = (b); i >= (_b); --i)
#define getBit(mask,i)  (((mask) >> (i)) & (1LL))
#define MASK(x)            (1LL << (x))
#define allof(x)        begin(x), end(x)
#define el              cout << '\n';

//--Compare------------------------------------------------------------------------------------
template<class X, class Y> 
    inline bool maximize(X &x, const Y &y){ return (x < y) ? x = y, 1 : 0; }

template<class X, class Y> 
    inline bool minimize(X &x, const Y &y){ return (x > y) ? x = y, 1 : 0; }

//--Process------------------------------------------------------------------------------------

// #define int             long long

struct DynamicSegmentTree
{
    struct Node
    {
        Node *left, *right;
        int lazy, sum;

        Node()
        {
            left = right = nullptr;
            sum = 0;
            lazy = -1;
        }
    };

    Node *root = new Node();

    void apply(Node *cur, int l, int r, int val)
    {
        if (val == -1) return;
        (cur->sum) = 1LL * (r - l + 1) * val;
        (cur->lazy) = val;
    }

    void down(Node *cur, int l, int r)
    {
        if (cur->left == nullptr) cur->left = new Node();
        if (cur->right == nullptr) cur->right = new Node();        

        int mid = (l + r) >> 1;
        apply(cur->left, l, mid, cur->lazy);
        apply(cur->right, mid + 1, r, cur->lazy);
        cur->lazy = -1;
    }

    void update_(int u, int v, int val, int l, int r, Node *cur)
    {
        if (v < l || r < u) return;
        if (u <= l && r <= v) return (void) (apply(cur, l, r, val));

        down(cur, l, r);
        int mid = (l + r) >> 1;
        update_(u, v, val, l, mid, cur->left);
        update_(u, v, val, mid + 1, r, cur->right);

        cur->sum = cur->left->sum + cur->right->sum;
    }

    int get_(int u, int v, int l, int r, Node *cur)
    {
        if (v < l || r < u) return 0;
        if (u <= l && r <= v) return cur->sum;

        down(cur, l, r);
        int mid = (l + r) >> 1;
        return get_(u, v, l, mid, cur->left) + get_ (u, v, mid + 1, r, cur->right);
    }

    void update(int u, int v, int val) { update_(u, v, val, 1, 1e9, root); }
    int get(int u, int v) { return get_(u, v, 1, 1e9, root); }
};

signed main(void)
{
    cin.tie(nullptr)->sync_with_stdio(false);
    // cin.exceptions(cin.failbit);


    #define task "f"
    if (fopen(task".INP", "r"))
    {
       freopen(task".INP", "r", stdin);
       freopen(task".OUT", "w", stdout);
    }
    //--OpenFile-------------------------------------------------------------------------------
    
    
    
    int q, C = 0; cin >> q;
    DynamicSegmentTree IT;
    IT.update(1, 1e9, 0);

    while (q--)
    {
        int cmd, l, r; cin >> cmd >> l >> r;
        if (cmd == 1)
        {
            C = IT.get(l + C, r + C);
            cout << C << '\n';
        }
        if (cmd == 2)
        {
            IT.update(l + C, r + C, 1);
        }
    }


    cerr << (1.0 * clock() / CLOCKS_PER_SEC);
    return 0;
}

Compilation message (stderr)

apple.cpp: In function 'int main()':
apple.cpp:94:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |        freopen(task".INP", "r", stdin);
      |        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
apple.cpp:95:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   95 |        freopen(task".OUT", "w", stdout);
      |        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...