Submission #1163386

#TimeUsernameProblemLanguageResultExecution timeMemory
1163386canhnam357Monkey and Apple-trees (IZhO12_apple)C++17
100 / 100
157 ms67496 KiB
// source problem : 
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define lb lower_bound
#define ub upper_bound
#define MASK(i) (1LL << (i))
void ckmax(int& f, int s)
{
    f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
    f = (f < s ? f : s);
}
const int N = 1e5;
const int D = 61;
int f[N * D] = {}, lc[N * D] = {}, rc[N * D] = {}, lz[N * D] = {}, cnt = 1;
void down(int id, int sz)
{
    if (!lz[id]) return;
    if (!lc[id]) lc[id] = cnt++;
    if (!rc[id]) rc[id] = cnt++;
    lz[lc[id]] = 1;
    f[lc[id]] = sz;
    lz[rc[id]] = 1;
    f[rc[id]] = sz;
    lz[id] = 0;
}
void update(int u, int v, int id = 0, int l = 1, int r = 1 << 30)
{
    if (r < u || l > v) return;
    if (l >= u && r <= v)
    {
        //cout << l << ' ' << r << ' ' << id << '\n';
        f[id] = r - l + 1;
        lz[id] = 1;
        return;
    }
    down(id, (r - l + 1) >> 1);
    int mid = (l + r) >> 1;
    if (mid >= u)
    {
        if (!lc[id]) lc[id] = cnt++;
        update(u, v, lc[id], l, mid);
    }
    if (mid + 1 <= v)
    {
        if (!rc[id]) rc[id] = cnt++;
        update(u, v, rc[id], mid + 1, r);
    }
    f[id] = (lc[id] ? f[lc[id]] : 0) + (rc[id] ? f[rc[id]] : 0);
}
int get(int u, int v, int id = 0, int l = 1, int r = 1 << 30)
{
    if (r < u || l > v) return 0;
    if (l >= u && r <= v) return f[id];
    down(id, (r - l + 1) >> 1);
    int mid = (l + r) >> 1;
    return (lc[id] ? get(u, v, lc[id], l, mid) : 0) + (rc[id] ? get(u, v, rc[id], mid + 1, r) : 0);
}
int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int q;
    cin >> q;
    int c = 0;
    while (q--)
    {
        int t, l, r;
        cin >> t >> l >> r;
        l += c;
        r += c;
        if (t == 1) 
        {
            c = get(l, r);
            cout << c << '\n';
        }
        else update(l, r);
        //cout << "ROOT " << f[0] << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...