답안 #543821

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
543821 2022-03-31T13:25:24 Z amunduzbaev 새 집 (APIO18_new_home) C++17
47 / 100
3514 ms 1048576 KB
#include "bits/stdc++.h"
using namespace std;

namespace NLOGsq{

	#define ar array
	#define pq priority_queue

	const int N = 3e5 + 5;
	const int M = 15 * N;
	const int MX = 1e8 + 5;
	 
	struct ST{
		multiset<int> tree[M][2];
		int f[M][2], last;
		ST(){
			last = 0;
		}
		
		void make(int x){
			if(!f[x][0]) f[x][0] = ++last;
			if(!f[x][1]) f[x][1] = ++last;
		}
		
		void add(int l, int r, int s, int t, int lx = 0, int rx = MX, int x = 0){
			if(lx > r || rx < l) return;
			if(lx >= l && rx <= r){
				if(t == 1){
					tree[x][0].insert(s + (lx - l));
					//~ tree[x][0] = max(tree[x][0], s + (lx - l));
				} else {
					tree[x][1].insert(s - (lx - l));
					//~ tree[x][1] = max(tree[x][1], s - (lx - l));
				} return;
			} int m = (lx + rx) >> 1;
			make(x);
			add(l, r, s, t, lx, m, f[x][0]), add(l, r, s, t, m+1, rx, f[x][1]);
		}
		
		void del(int l, int r, int s, int t, int lx = 0, int rx = MX, int x = 0){
			if(lx > r || rx < l) return;
			if(lx >= l && rx <= r){
				if(t == 1){
					tree[x][0].erase(tree[x][0].find(s + (lx - l)));
				} else {
					tree[x][1].erase(tree[x][1].find(s - (lx - l)));
				} return;
			} int m = (lx + rx) >> 1;
			make(x);
			del(l, r, s, t, lx, m, f[x][0]), del(l, r, s, t, m+1, rx, f[x][1]);
		}
		
		int get(int i, int lx = 0, int rx = MX, int x = 0){
			int res = 0;
			if(!tree[x][0].empty()) res = max(res, (*--tree[x][0].end()) + (i - lx));
			if(!tree[x][1].empty()) res = max(res, (*--tree[x][1].end()) - (i - lx));
			if(lx == rx) return res;
			int m = (lx + rx) >> 1;
			if(i <= m) return max((f[x][0] ? get(i, lx, m, f[x][0]) : 0), res);
			else return max((f[x][1] ? get(i, m+1, rx, f[x][1]) : 0), res);
		}
	}tree;
	/*

	4 2 4
	3 1 1 10
	9 2 2 4
	7 2 5 7
	4 1 8 10
	5 3
	5 6
	5 9
	1 10

	2 1 3
	1 1 1 4
	1 1 2 6
	1 3
	1 5
	1 7

	1 1 1
	100000000 1 1 1
	1 1

	*/

	int x[N], t[N], a[N], b[N], l[N], y[N];
	multiset<int> ss[N];
	
	void solve(int n, int k, int q){
		for(int i=0;i<n;i++){
			cin>>x[i]>>t[i]>>a[i]>>b[i];
			--t[i];
		}

		auto add = [&](int l, int r){
			if(l == r) return;
			int m = (l + r) >> 1;
			tree.add(l, m, 0, 1);
			tree.add(m + 1, r, r - m - 1, -1);
		}; auto inc = [&](int x) { tree.add(x, MX, 0, 1); };
		auto dec = [&](int x) { tree.add(0, x, x, -1); };
		
		auto dadd = [&](int l, int r){
			if(l == r) return;
			int m = (l + r) >> 1;
			tree.del(l, m, 0, 1);
			tree.del(m + 1, r, r - m - 1, -1);
		}; auto dinc = [&](int x) { tree.del(x, MX, 0, 1); };
		auto ddec = [&](int x) { tree.del(0, x, x, -1); };
		
		//~ bool is = 1;
		//~ for(int i=0;i<k;i++){
			//~ if(stor[i].empty()) { is = 0; break; }
			//~ sort(stor[i].begin(), stor[i].end(), [&](int i, int j){
				//~ return (x[i] < x[j]);
			//~ });
			//~ for(int j=1;j<(int)stor[i].size();j++){
				//~ add(x[stor[i][j-1]], x[stor[i][j]]);
			//~ }
			
			//~ dec(x[stor[i][0]]);
			//~ inc(x[stor[i].back()]);
		//~ }
		
		vector<int> in(n); iota(in.begin(), in.end(), 0);
		vector<int> out(n); iota(out.begin(), out.end(), 0);
		sort(in.begin(), in.end(), [&](int i, int j){
			return (a[i] < a[j]);
		});
		sort(out.begin(), out.end(), [&](int i, int j){
			return (b[i] < b[j]);
		});
		vector<int> p(q);
		
		for(int i=0;i<q;i++){ p[i] = i;
			cin>>l[i]>>y[i];
		}
		
		sort(p.begin(), p.end(), [&](int i, int j){
			return (y[i] < y[j]);
		});
		
		int I = 0, O = 0, c = k;
		auto NEW = [&](int i){
			auto it = ss[t[i]].upper_bound(x[i]);
			if(ss[t[i]].empty()) c--;
			if(it == ss[t[i]].end()){
				if(it != ss[t[i]].begin()){
					it--;
					dinc(*it);
					add(*it, x[i]);
					inc(x[i]);
				} else {
					inc(x[i]);
					dec(x[i]);
				}
			} else {
				if(it == ss[t[i]].begin()){
					ddec(*it);
					add(x[i], *it);
					dec(x[i]);
				} else {
					auto R = it; it--;
					dadd(*it, *R);
					add(*it, x[i]);
					add(x[i], *R);
				}
			}
			
			ss[t[i]].insert(x[i]);
		};
		
		auto DEL = [&](int i){
			ss[t[i]].erase(ss[t[i]].find(x[i]));
			if(ss[t[i]].empty()) c++;
			auto it = ss[t[i]].upper_bound(x[i]);
			if(it == ss[t[i]].end()){
				if(it == ss[t[i]].begin()){
					dinc(x[i]);
					ddec(x[i]);
				} else {
					it--;
					dadd(*it, x[i]);
					dinc(x[i]);
					inc(*it);
				}
			} else {
				if(it == ss[t[i]].begin()){
					dadd(x[i], *it);
					ddec(x[i]);
					dec(*it);
				} else {
					auto R = it; it--;
					dadd(*it, x[i]);
					dadd(x[i], *R);
					add(*it, *R);
				}
			}
		};
		
		vector<int> res(q);
		for(auto i : p){
			while(I < n && a[in[I]] <= y[i]){
				NEW(in[I]);
				I++;
			}
			
			while(O < n && b[out[O]] < y[i]){
				DEL(out[O]);
				O++;
			}
			
			if(!c) res[i] = tree.get(l[i]);
			else res[i] = -1;
		}
		
		for(int i=0;i<q;i++) cout<<res[i]<<"\n";
	}
};

namespace temp{
	const int N = 3e5 + 5;
	const int M = N * 20;
	const int MX = 1e8 + 5;
	
	struct ST{
		int tree[M][2], f[M][2];
		int last;
		
		ST(){
			memset(tree, -1, sizeof tree);
			last = 0;
		}
		
		void make(int x){
			if(!f[x][0]) f[x][0] = ++last;
			if(!f[x][1]) f[x][1] = ++last;
		}
		
		void umax(int l, int r, int s, int t, int lx = 0, int rx = MX, int x = 0){
			if(lx > r || rx < l) return;
			if(lx >= l && rx <= r){
				if(t == 1) tree[x][0] = max(tree[x][0], s);
				else tree[x][1] = max(tree[x][1], s);
				return;
			} int m = (lx + rx) >> 1;
			make(x);
			umax(l, r, s, t, lx, m, f[x][0]);
			umax(l, r, s, t, m+1, rx, f[x][1]);
		}
		
		int get(int i, int lx = 0, int rx = MX, int x = 0){
			int res = 0;
			if(~tree[x][0]) res = max(res, tree[x][0] + (i - lx));
			if(~tree[x][1]) res = max(res, tree[x][1] - (i - lx));
			if(lx == rx) return res;
			int m = (lx + rx) >> 1;
			if(i <= m) return max((f[x][0] ? get(i, lx, m, f[x][0]) : 0), res);
			else return max((f[x][1] ? get(i, m+1, rx, f[x][1]) : 0), res);
		}
	}tree;
	
	int x[N], t[N], a[N], b[N], l[N], y[N];
	multiset<int> ss[N];
	
	void solve(int n, int k, int q){
		for(int i=0;i<n;i++){
			cin>>x[i]>>t[i]>>a[i]>>b[i];
			--t[i];
		}

		auto add = [&](int l, int r){
			if(l == r) return;
			int m = (l + r) >> 1;
			tree.umax(l, m, 0, 1);
			tree.umax(m + 1, r, r - m - 1, -1);
		}; auto inc = [&](int x) { tree.umax(x, MX, 0, 1); };
		auto dec = [&](int x) { tree.umax(0, x, x, -1); };
		
		//~ auto dadd = [&](int l, int r){
			//~ if(l == r) return;
			//~ int m = (l + r) >> 1;
			//~ tree.del(l, m, 0, 1);
			//~ tree.del(m + 1, r, r - m - 1, -1);
		//~ }; auto dinc = [&](int x) { tree.del(x, MX, 0, 1); };
		//~ auto ddec = [&](int x) { tree.del(0, x, x, -1); };
		
		//~ bool is = 1;
		//~ for(int i=0;i<k;i++){
			//~ if(stor[i].empty()) { is = 0; break; }
			//~ sort(stor[i].begin(), stor[i].end(), [&](int i, int j){
				//~ return (x[i] < x[j]);
			//~ });
			//~ for(int j=1;j<(int)stor[i].size();j++){
				//~ add(x[stor[i][j-1]], x[stor[i][j]]);
			//~ }
			
			//~ dec(x[stor[i][0]]);
			//~ inc(x[stor[i].back()]);
		//~ }
		
		vector<int> in(n); iota(in.begin(), in.end(), 0);
		vector<int> out(n); iota(out.begin(), out.end(), 0);
		sort(in.begin(), in.end(), [&](int i, int j){
			return (a[i] < a[j]);
		});
		sort(out.begin(), out.end(), [&](int i, int j){
			return (b[i] < b[j]);
		});
		vector<int> p(q);
		
		for(int i=0;i<q;i++){ p[i] = i;
			cin>>l[i]>>y[i];
		}
		
		sort(p.begin(), p.end(), [&](int i, int j){
			return (y[i] < y[j]);
		});
		
		int I = 0, O = 0, c = k;
		auto NEW = [&](int i){
			auto it = ss[t[i]].upper_bound(x[i]);
			if(ss[t[i]].empty()) c--;
			if(it == ss[t[i]].end()){
				if(it != ss[t[i]].begin()){
					it--;
					//~ dinc(*it);
					add(*it, x[i]);
					inc(x[i]);
				} else {
					inc(x[i]);
					dec(x[i]);
				}
			} else {
				if(it == ss[t[i]].begin()){
					//~ ddec(*it);
					add(x[i], *it);
					dec(x[i]);
				} else {
					auto R = it; it--;
					//~ dadd(*it, *R);
					add(*it, x[i]);
					add(x[i], *R);
				}
			}
			
			ss[t[i]].insert(x[i]);
		};
		
		auto DEL = [&](int i){
			ss[t[i]].erase(ss[t[i]].find(x[i]));
			if(ss[t[i]].empty()) c++;
			auto it = ss[t[i]].upper_bound(x[i]);
			if(it == ss[t[i]].end()){
				if(it == ss[t[i]].begin()){
					//~ dinc(x[i]);
					//~ ddec(x[i]);
				} else {
					it--;
					//~ dadd(*it, x[i]);
					//~ dinc(x[i]);
					inc(*it);
				}
			} else {
				if(it == ss[t[i]].begin()){
					//~ dadd(x[i], *it);
					//~ ddec(x[i]);
					dec(*it);
				} else {
					auto R = it; it--;
					//~ dadd(*it, x[i]);
					//~ dadd(x[i], *R);
					add(*it, *R);
				}
			}
		};
		
		vector<int> res(q);
		for(auto i : p){
			while(I < n && a[in[I]] <= y[i]){
				NEW(in[I]);
				I++;
			}
			
			while(O < n && b[out[O]] < y[i]){
				DEL(out[O]);
				O++;
			}
			
			if(!c) res[i] = tree.get(l[i]);
			else res[i] = -1;
		}
		
		for(int i=0;i<q;i++) cout<<res[i]<<"\n";
	}
};

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, k, q; cin>>n>>k>>q;
	if(n <= 60000 && q <= 60000){
		NLOGsq::solve(n, k, q);
	} else {
		temp::solve(n, k, q);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 204 ms 498192 KB Output is correct
2 Correct 226 ms 498208 KB Output is correct
3 Correct 212 ms 498100 KB Output is correct
4 Correct 208 ms 498236 KB Output is correct
5 Correct 214 ms 498124 KB Output is correct
6 Correct 216 ms 498820 KB Output is correct
7 Correct 211 ms 498508 KB Output is correct
8 Correct 217 ms 499168 KB Output is correct
9 Correct 235 ms 498864 KB Output is correct
10 Correct 217 ms 499240 KB Output is correct
11 Correct 215 ms 498376 KB Output is correct
12 Correct 208 ms 498568 KB Output is correct
13 Correct 210 ms 498380 KB Output is correct
14 Correct 212 ms 498336 KB Output is correct
15 Correct 211 ms 498636 KB Output is correct
16 Correct 210 ms 498640 KB Output is correct
17 Correct 212 ms 498492 KB Output is correct
18 Correct 212 ms 498608 KB Output is correct
19 Correct 214 ms 498720 KB Output is correct
20 Correct 235 ms 498604 KB Output is correct
21 Correct 211 ms 498676 KB Output is correct
22 Correct 207 ms 498796 KB Output is correct
23 Correct 238 ms 498948 KB Output is correct
24 Correct 217 ms 498888 KB Output is correct
25 Correct 214 ms 498636 KB Output is correct
26 Correct 211 ms 498508 KB Output is correct
27 Correct 215 ms 498480 KB Output is correct
28 Correct 214 ms 498444 KB Output is correct
29 Correct 214 ms 498508 KB Output is correct
30 Correct 212 ms 498364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 204 ms 498192 KB Output is correct
2 Correct 226 ms 498208 KB Output is correct
3 Correct 212 ms 498100 KB Output is correct
4 Correct 208 ms 498236 KB Output is correct
5 Correct 214 ms 498124 KB Output is correct
6 Correct 216 ms 498820 KB Output is correct
7 Correct 211 ms 498508 KB Output is correct
8 Correct 217 ms 499168 KB Output is correct
9 Correct 235 ms 498864 KB Output is correct
10 Correct 217 ms 499240 KB Output is correct
11 Correct 215 ms 498376 KB Output is correct
12 Correct 208 ms 498568 KB Output is correct
13 Correct 210 ms 498380 KB Output is correct
14 Correct 212 ms 498336 KB Output is correct
15 Correct 211 ms 498636 KB Output is correct
16 Correct 210 ms 498640 KB Output is correct
17 Correct 212 ms 498492 KB Output is correct
18 Correct 212 ms 498608 KB Output is correct
19 Correct 214 ms 498720 KB Output is correct
20 Correct 235 ms 498604 KB Output is correct
21 Correct 211 ms 498676 KB Output is correct
22 Correct 207 ms 498796 KB Output is correct
23 Correct 238 ms 498948 KB Output is correct
24 Correct 217 ms 498888 KB Output is correct
25 Correct 214 ms 498636 KB Output is correct
26 Correct 211 ms 498508 KB Output is correct
27 Correct 215 ms 498480 KB Output is correct
28 Correct 214 ms 498444 KB Output is correct
29 Correct 214 ms 498508 KB Output is correct
30 Correct 212 ms 498364 KB Output is correct
31 Correct 3483 ms 631248 KB Output is correct
32 Correct 386 ms 502092 KB Output is correct
33 Correct 2168 ms 559680 KB Output is correct
34 Correct 3514 ms 569172 KB Output is correct
35 Correct 2984 ms 622956 KB Output is correct
36 Correct 2202 ms 603072 KB Output is correct
37 Correct 2007 ms 536312 KB Output is correct
38 Correct 1748 ms 535344 KB Output is correct
39 Correct 1039 ms 530136 KB Output is correct
40 Correct 1033 ms 530852 KB Output is correct
41 Correct 1357 ms 521764 KB Output is correct
42 Correct 1400 ms 521948 KB Output is correct
43 Correct 282 ms 504396 KB Output is correct
44 Correct 1299 ms 521564 KB Output is correct
45 Correct 1114 ms 521180 KB Output is correct
46 Correct 948 ms 521776 KB Output is correct
47 Correct 653 ms 518524 KB Output is correct
48 Correct 651 ms 519572 KB Output is correct
49 Correct 788 ms 520156 KB Output is correct
50 Correct 990 ms 520140 KB Output is correct
51 Correct 779 ms 520536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1345 ms 1048576 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1440 ms 1048576 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 204 ms 498192 KB Output is correct
2 Correct 226 ms 498208 KB Output is correct
3 Correct 212 ms 498100 KB Output is correct
4 Correct 208 ms 498236 KB Output is correct
5 Correct 214 ms 498124 KB Output is correct
6 Correct 216 ms 498820 KB Output is correct
7 Correct 211 ms 498508 KB Output is correct
8 Correct 217 ms 499168 KB Output is correct
9 Correct 235 ms 498864 KB Output is correct
10 Correct 217 ms 499240 KB Output is correct
11 Correct 215 ms 498376 KB Output is correct
12 Correct 208 ms 498568 KB Output is correct
13 Correct 210 ms 498380 KB Output is correct
14 Correct 212 ms 498336 KB Output is correct
15 Correct 211 ms 498636 KB Output is correct
16 Correct 210 ms 498640 KB Output is correct
17 Correct 212 ms 498492 KB Output is correct
18 Correct 212 ms 498608 KB Output is correct
19 Correct 214 ms 498720 KB Output is correct
20 Correct 235 ms 498604 KB Output is correct
21 Correct 211 ms 498676 KB Output is correct
22 Correct 207 ms 498796 KB Output is correct
23 Correct 238 ms 498948 KB Output is correct
24 Correct 217 ms 498888 KB Output is correct
25 Correct 214 ms 498636 KB Output is correct
26 Correct 211 ms 498508 KB Output is correct
27 Correct 215 ms 498480 KB Output is correct
28 Correct 214 ms 498444 KB Output is correct
29 Correct 214 ms 498508 KB Output is correct
30 Correct 212 ms 498364 KB Output is correct
31 Correct 3483 ms 631248 KB Output is correct
32 Correct 386 ms 502092 KB Output is correct
33 Correct 2168 ms 559680 KB Output is correct
34 Correct 3514 ms 569172 KB Output is correct
35 Correct 2984 ms 622956 KB Output is correct
36 Correct 2202 ms 603072 KB Output is correct
37 Correct 2007 ms 536312 KB Output is correct
38 Correct 1748 ms 535344 KB Output is correct
39 Correct 1039 ms 530136 KB Output is correct
40 Correct 1033 ms 530852 KB Output is correct
41 Correct 1357 ms 521764 KB Output is correct
42 Correct 1400 ms 521948 KB Output is correct
43 Correct 282 ms 504396 KB Output is correct
44 Correct 1299 ms 521564 KB Output is correct
45 Correct 1114 ms 521180 KB Output is correct
46 Correct 948 ms 521776 KB Output is correct
47 Correct 653 ms 518524 KB Output is correct
48 Correct 651 ms 519572 KB Output is correct
49 Correct 788 ms 520156 KB Output is correct
50 Correct 990 ms 520140 KB Output is correct
51 Correct 779 ms 520536 KB Output is correct
52 Correct 1012 ms 589044 KB Output is correct
53 Correct 989 ms 539980 KB Output is correct
54 Correct 2714 ms 629728 KB Output is correct
55 Correct 1368 ms 544472 KB Output is correct
56 Correct 1338 ms 555596 KB Output is correct
57 Correct 1467 ms 528632 KB Output is correct
58 Correct 1589 ms 544552 KB Output is correct
59 Correct 1436 ms 555724 KB Output is correct
60 Correct 1666 ms 528820 KB Output is correct
61 Correct 635 ms 577332 KB Output is correct
62 Correct 1041 ms 589008 KB Output is correct
63 Correct 2023 ms 598216 KB Output is correct
64 Correct 2406 ms 586808 KB Output is correct
65 Correct 2823 ms 543320 KB Output is correct
66 Correct 1642 ms 523160 KB Output is correct
67 Correct 1332 ms 511292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 204 ms 498192 KB Output is correct
2 Correct 226 ms 498208 KB Output is correct
3 Correct 212 ms 498100 KB Output is correct
4 Correct 208 ms 498236 KB Output is correct
5 Correct 214 ms 498124 KB Output is correct
6 Correct 216 ms 498820 KB Output is correct
7 Correct 211 ms 498508 KB Output is correct
8 Correct 217 ms 499168 KB Output is correct
9 Correct 235 ms 498864 KB Output is correct
10 Correct 217 ms 499240 KB Output is correct
11 Correct 215 ms 498376 KB Output is correct
12 Correct 208 ms 498568 KB Output is correct
13 Correct 210 ms 498380 KB Output is correct
14 Correct 212 ms 498336 KB Output is correct
15 Correct 211 ms 498636 KB Output is correct
16 Correct 210 ms 498640 KB Output is correct
17 Correct 212 ms 498492 KB Output is correct
18 Correct 212 ms 498608 KB Output is correct
19 Correct 214 ms 498720 KB Output is correct
20 Correct 235 ms 498604 KB Output is correct
21 Correct 211 ms 498676 KB Output is correct
22 Correct 207 ms 498796 KB Output is correct
23 Correct 238 ms 498948 KB Output is correct
24 Correct 217 ms 498888 KB Output is correct
25 Correct 214 ms 498636 KB Output is correct
26 Correct 211 ms 498508 KB Output is correct
27 Correct 215 ms 498480 KB Output is correct
28 Correct 214 ms 498444 KB Output is correct
29 Correct 214 ms 498508 KB Output is correct
30 Correct 212 ms 498364 KB Output is correct
31 Correct 3483 ms 631248 KB Output is correct
32 Correct 386 ms 502092 KB Output is correct
33 Correct 2168 ms 559680 KB Output is correct
34 Correct 3514 ms 569172 KB Output is correct
35 Correct 2984 ms 622956 KB Output is correct
36 Correct 2202 ms 603072 KB Output is correct
37 Correct 2007 ms 536312 KB Output is correct
38 Correct 1748 ms 535344 KB Output is correct
39 Correct 1039 ms 530136 KB Output is correct
40 Correct 1033 ms 530852 KB Output is correct
41 Correct 1357 ms 521764 KB Output is correct
42 Correct 1400 ms 521948 KB Output is correct
43 Correct 282 ms 504396 KB Output is correct
44 Correct 1299 ms 521564 KB Output is correct
45 Correct 1114 ms 521180 KB Output is correct
46 Correct 948 ms 521776 KB Output is correct
47 Correct 653 ms 518524 KB Output is correct
48 Correct 651 ms 519572 KB Output is correct
49 Correct 788 ms 520156 KB Output is correct
50 Correct 990 ms 520140 KB Output is correct
51 Correct 779 ms 520536 KB Output is correct
52 Runtime error 1345 ms 1048576 KB Execution killed with signal 11
53 Halted 0 ms 0 KB -