Submission #682606

# Submission time Handle Problem Language Result Execution time Memory
682606 2023-01-16T15:06:02 Z phoenix Segments (IZhO18_segments) C++17
0 / 100
183 ms 26472 KB
#include<bits/stdc++.h>

using namespace std;
const int N = (1 << 17);

struct tree {
    vector<int> st[2 * N];
    int sz = 0;
    void init(vector<int> &a) {
        sz = (int)a.size();
        build(a, 0, sz - 1, 1);
    }
    void build(vector<int> &a, int l, int r, int v) {
        if(l == r) {
            st[v].push_back(a[l]);
            return;
        }
        int m = (l + r) / 2;
        build(a, l, m, 2 * v);
        build(a, m + 1, r, 2 * v + 1);
        int lb = 0, rb = 0;
        while(lb < (int)st[2 * v].size() || rb < (int)st[2 * v + 1].size()) {
            int val1 = 2e9 + 1, val2 = 2e9 + 1;
            if(lb < (int)st[2 * v].size()) val1 = st[2 * v][lb];
            if(rb < (int)st[2 * v + 1].size()) val2 = st[2 * v + 1][rb];
            if(val1 < val2) st[v].push_back(st[2 * v][lb++]);
            else st[v].push_back(st[2 * v + 1][rb++]);
        }
    }
    int get(int ql, int qr, int x, int l, int r, int v) {
        if(ql > qr || r < ql || l > qr) 
            return 0;
        if(ql <= l && r <= qr) {
            int lb = -1, rb = (int)st[v].size();
            while(rb - lb > 1) {
                int m = (lb + rb) / 2;
                if(st[v][m] < x) lb = m;
                else rb = m;
            }
            return lb + 1;
        }
        int m = (l + r) / 2;
        return get(ql, qr, x, l, m, 2 * v) + get(ql, qr, x, m + 1, r, 2 * v + 1);
    }
    int get(int ql, int qr, int x) {
        return get(ql, qr, x, 0, sz - 1, 1);
    }

};
vector<pair<int, int>> v;
// left bounds, right bounds
vector<int> ll, rr;
tree t1, t2;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    
    int n, t;
    cin >> n >> t;
    int lastans = 0;
    bool isBuilt = 0;
    for(int op = 1; op <= n; op++) {
        int type;
        cin >> type;
        if(type == 1) {
            int l, r;
            cin >> l >> r;
            l = (l ^ (t * lastans));
            r = (r ^ (t * lastans));
            if(l > r) swap(l, r);
            v.push_back({l, r});
        } else {
            if(!isBuilt) {
                sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b){return a.second - a.first < b.second - b.first;});
                for(int i = 0; i < (int)v.size(); i++) {
                    ll.push_back(v[i].first);
                    rr.push_back(v[i].second);
                }
                t1.init(ll);
                t2.init(rr);
                isBuilt = 1;
            }
            int l, r, k;
            cin >> l >> r >> k;
            l = (l ^ (t * lastans));
            r = (r ^ (t * lastans));
            lastans = 0;
            if(l > r) swap(l, r);
            if(r - l + 1 < k) {
                cout << 0 << '\n';
                continue;
            }

            int lb = -1, rb = (int)v.size();
            while(rb - lb > 1) {
                int m = (lb + rb) / 2;
                if(v[m].second - v[m].first + 1 >= k) rb = m;
                else lb = m;
            }
            
            lastans = t1.get(rb, (int)v.size() - 1, r - k + 2) - rb - t2.get(rb, (int)v.size() - 1, l + k - 1);
            cout << lastans << '\n';
        }
    }
}
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 12500 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 183 ms 26472 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 38 ms 13044 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 40 ms 13164 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 12500 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 12500 KB Output isn't correct
2 Halted 0 ms 0 KB -