Submission #441484

#TimeUsernameProblemLanguageResultExecution timeMemory
441484fhvirusSegments (IZhO18_segments)C++17
16 / 100
1568 ms7472 KiB
    // Knapsack DP is harder than FFT.
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll;
    #define ff first
    #define ss second
    #define pb emplace_back
    #define AI(x) begin(x),end(x)
    template<class I>bool chmax(I&a,I b){return a<b?(a=b,true):false;}
    template<class I>bool chmin(I&a,I b){return b<a?(a=b,true):false;} 
    #ifdef OWO
    #define debug(args...) SDF(#args, args)
    #define OIU(args...) ostream& operator<<(ostream&O,args)
    #define LKJ(S,B,E,F) template<class...T>OIU(S<T...>s){O<<B;int c=0;for(auto i:s)O<<(c++?", ":"")<<F;return O<<E;}
    LKJ(vector,'[',']',i)LKJ(deque,'[',']',i)LKJ(set,'{','}',i)LKJ(multiset,'{','}',i)LKJ(unordered_set,'{','}',i)LKJ(map,'{','}',i.ff<<':'<<i.ss)LKJ(unordered_map,'{','}',i.ff<<':'<<i.ss)
    template<class...T>void SDF(const char* s,T...a){int c=sizeof...(T);if(!c){cerr<<"\033[1;32mvoid\033[0m\n";return;}(cerr<<"\033[1;32m("<<s<<") = (",...,(cerr<<a<<(--c?", ":")\033[0m\n")));}
    template<class T,size_t N>OIU(array<T,N>a){return O<<vector<T>(AI(a));}template<class...T>OIU(pair<T...>p){return O<<'('<<p.ff<<','<<p.ss<<')';}template<class...T>OIU(tuple<T...>t){return O<<'(',apply([&O](T...s){int c=0;(...,(O<<(c++?", ":"")<<s));},t),O<<')';}
    #else
    #pragma GCC optimize("Ofast")
    #define debug(...) ((void)0)
    #endif
     
    const int inf = INT_MAX; 
    const int kN = 200002;
     
    struct PRE: vector<pii> {
    	void build(){
    		if(empty()) return;
    		sort(AI());
    		auto i = begin(), j = next(i);
    		for(; j != end(); ++j){
    			if(i->ff != j->ff){
    				++i; *i = *j;
    				i->ss += prev(i)->ss;
    			} else i->ss += j->ss;
    		}
    		erase(next(i), end());
    	}
    	int que(int p){
    		auto i = lower_bound(AI(), pii(p, inf));
    		return i == begin() ? 0 : prev(i)->ss;
    	}
    };
     
    int n, t; 
    int tot = 0;
    pii seg[kN]; 
     
    int cnt, bnd; 
    vector<tuple<int, int, int>> all, tmp;
    PRE sl, sr;
    void mod(int l, int r, int v){
    	tmp.pb(l, r, v);
    	++cnt;
    }
    void insert(int l, int r){
    	seg[++tot] = pii(l, r);
    	mod(l, r, 1);
    }
    void remove(int id){
    	auto [l, r] = seg[id];
    	mod(l, r, -1);
    }
    int query(int ql, int qr, int k){
       if(cnt >= bnd){
    	// rebuild
    	cnt = 0;
    	all.insert(end(all), AI(tmp)); tmp.clear();
    	sl.clear(); sr.clear();
    	for(auto [l, r, v]: all){
    		sl.pb(l, v);
    		sr.pb(r, v);
    	}
    	sl.build();
    	sr.build();
       }
    	// #( l <= qr ) - #( r < ql )
    	debug(ql, qr, k);
    	debug(sl, sr, tmp);
    	int ans = sl.que(qr) - sr.que(ql - 1);
    	for(auto [l, r, v]: tmp){
    		if(l <= qr) ans += v;
    		if(r <  ql) ans -= v;
    	}
    	return ans;
    }
     
    signed main(){
    	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	cin >> n >> t;
    	bnd = ceil(sqrt(n));
    	int lastans = 0;
    	for(int cmd, a, b, k, id, i = 0; i < n; ++i){
    		cin >> cmd;
    		if(cmd == 1){
    			cin >> a >> b;
    			int l = (a ^ (lastans * t));
    			int r = (b ^ (lastans * t));
    			if(l > r) swap(l, r);
    			insert(l, r); 
    		} else if(cmd == 2){
    			cin >> id;
    			remove(id);
    		} else if(cmd == 3){
    			cin >> a >> b >> k;
    			int l = (a ^ (lastans * t));
    			int r = (b ^ (lastans * t));
    			if(l > r) swap(l, r);
    			lastans = query(l, r, k);
    			cout << lastans << '\n';
    		}
    	}
    	return 0;
    }
#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...