Submission #58825

#TimeUsernameProblemLanguageResultExecution timeMemory
58825BenqSegments (IZhO18_segments)C++14
22 / 100
1893 ms41984 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; typedef complex<ld> cd; typedef pair<int, int> pi; typedef pair<ll,ll> pl; typedef pair<ld,ld> pd; typedef vector<int> vi; typedef vector<ld> vd; typedef vector<ll> vl; typedef vector<pi> vpi; typedef vector<pl> vpl; typedef vector<cd> vcd; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; #define FOR(i, a, b) for (int i=a; i<(b); i++) #define F0R(i, a) for (int i=0; i<(a); i++) #define FORd(i,a,b) for (int i = (b)-1; i >= a; i--) #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--) #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define f first #define s second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() const int MOD = 1000000007; const ll INF = 1e18; const int MX = 200001; int n,t,ans, cbucket[MX], L[MX], R[MX]; vi buckety[400], bucketyx[400]; vpi lst[400]; bool cmp(int l, int r) { if (L[l] != L[r]) return L[l] < L[r]; return l < r; } void rebuild() { vpi v; F0R(i,400) { v.insert(v.end(),all(lst[i])); buckety[i].clear(), bucketyx[i].clear(), lst[i].clear(); } F0R(i,400) { FOR(j,i*sz(v)/400,(i+1)*sz(v)/400) { int id = v[j].s; cbucket[id] = i; buckety[i].pb(R[id]); bucketyx[i].pb(R[id]-L[id]); lst[i].pb(v[j]); } sort(all(buckety[i])); sort(all(bucketyx[i])); } } template<class T> void ins(vector<T>& v, T x, int ad = 1) { auto it = lb(all(v),x); if (ad == 1) v.insert(it,x); else { assert(it != v.end()); v.erase(it); } } void del(int id) { int b = cbucket[id]; ins(buckety[b],R[id],-1); ins(bucketyx[b],R[id]-L[id],-1); ins(lst[b],{L[id],id},-1); } void upd(int id, int l, int r) { L[id] = l, R[id] = r; int b = 0; while (b < 399 && (sz(lst[b]) == 0 || lst[b].back() < mp(L[id],id))) b ++; cbucket[id] = b; ins(buckety[b],R[id]); ins(bucketyx[b],R[id]-L[id]); ins(lst[b],{L[id],id}); } int hix, loy, loyx; int manual(int x, int l) { int t = 0; for (pi i: lst[x]) { if (i.f > hix) continue; if (i.f > l) t += ((R[i.s]-L[i.s]) >= loyx); else t += (R[i.s] >= loy); } return t; } int atLeast(vi& x, int y) { return distance(lb(all(x),y),x.end()); } int query(int l, int r, int k) { if (k > r-l+1) return 0; hix = r-k+1, loy = l+k-1, loyx = k-1; // y >= loy, y >= x+loyx int ans = 0; int clst = -MOD; F0R(i,400) if (sz(lst[i])) { if (lst[i].back().f > hix) { ans += manual(i,l); break; } else if (lst[i].back().f > l) { if (clst <= l) ans += manual(i,l); else ans += atLeast(bucketyx[i],loyx); } else { ans += atLeast(buckety[i],loy); } clst = lst[i].back().f; } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> t; int cur = 0, nex = 1; F0R(i,n) { int z; cin >> z; if (z == 1) { int l,r; cin >> l >> r; l ^= (t*ans), r ^= (t*ans); if (l > r) swap(l,r); upd(nex++,l,r); } else if (z == 2) { int id; cin >> id; del(id); } else { int l,r,k; cin >> l >> r >> k; l ^= (t*ans), r ^= (t*ans); if (l > r) swap(l,r); ans = query(l,r,k); cout << ans << "\n"; } cur ++; if (cur % 500 == 0) rebuild(); } } /* Look for: * the exact constraints (multiple sets are too slow for n=10^6 :( ) * special cases (n=1?) * overflow (ll vs int?) * array bounds */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...