Submission #381244

#TimeUsernameProblemLanguageResultExecution timeMemory
381244rainboyNew Home (APIO18_new_home)C11
47 / 100
5091 ms246948 KiB
#include <stdio.h>
#include <stdlib.h>
 
#define N	300000
#define Q	300000
#define N_	(1 << 19)	/* N_ = pow2(ceil(log2(Q))) */
#define INF	0x3f3f3f3f
 
int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }
 
unsigned int X = 12345;
 
int rand_() {
	return (X *= 3) >> 1;
}
 
int xx[N], gg[N], n;
int yy[Q], yy_[Q], tt_[Q], tt1[Q], q_;
 
int compareh_y(int h1, int h2) {
	return yy[h1] - yy[h2];
}
 
int compareh_t(int h1, int h2) {
	return tt_[h1] - tt_[h2];
}
 
int compare_i(int i, int j) {
	return gg[i] != gg[j] ? gg[i] - gg[j] : xx[i] - xx[j];
}
 
int (*compare)(int, int);
 
void sort(int *ii, int l, int r) {
	while (l < r) {
		int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;
 
		while (j < k) {
			int c = compare(ii[j], i_);
 
			if (c == 0)
				j++;
			else if (c < 0) {
				tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
				i++, j++;
			} else {
				k--;
				tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
			}
		}
		sort(ii, l, i);
		l = k;
	}
}
 
int idx(int *xx, int x) {
	int lower = -1, upper = q_;
 
	while (upper - lower > 1) {
		int h = (lower + upper) / 2;
 
		if (xx[h] <= x)
			lower = h;
		else
			upper = h;
	}
	return lower;
}
 
int *stmn[N_ * 2], *stmx[N_ * 2], eo[N_ * 2], eo1[N_ * 2], *ei[N_ * 2], eo_[N_ * 2], n_;
 
void push(int i, int x) {
	int o = eo[i]++;
 
	if (o == eo1[i]) {
		eo1[i] *= 2;
		stmn[i] = (int *) realloc(stmn[i], eo1[i] * sizeof *stmn[i]);
		stmx[i] = (int *) realloc(stmx[i], eo1[i] * sizeof *stmx[i]);
	}
	stmn[i][o] = min(o == 0 ? INF : stmn[i][o - 1], x);
	stmx[i][o] = max(o == 0 ? -INF : stmx[i][o - 1], x);
}
 
void pop(int i) {
	eo[i]--;
}
 
int getmin(int i) {
	return eo[i] == 0 ? INF : stmn[i][eo[i] - 1];
}
 
int getmax(int i) {
	return eo[i] == 0 ? -INF : stmx[i][eo[i] - 1];
}
 
void build() {
	int i;
 
	n_ = 1;
	while (n_ < q_)
		n_ <<= 1;
	for (i = 1; i < n_ * 2; i++) {
		eo1[i] = 2;
		stmn[i] = (int *) malloc(eo1[i] * sizeof *stmn[i]);
		stmx[i] = (int *) malloc(eo1[i] * sizeof *stmx[i]);
	}
	for (i = 1; i < n_ * 2; i++)
		ei[i] = (int *) malloc(2 * sizeof *ei[i]);
}
 
void update(int l, int r, int x) {
	for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1)
			push(l++, x);
		if ((r & 1) == 0)
			push(r--, x);
	}
}
 
void undo(int l, int r) {
	for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1)
			pop(l++);
		if ((r & 1) == 0)
			pop(r--);
	}
}
 
int query(int i) {
	int y, l, r;
 
	l = r = y = yy_[i];
	for (i += n_; i > 0; i >>= 1)
		l = min(l, getmin(i)), r = max(r, getmax(i));
	return l == -INF || r == INF ? -1 : max(y - l, r - y);
}
 
int mid(int a, int b) {
	return a + b > 0 ? (a + b) / 2 : -(-a + b + 1) / 2;
}
 
int pp[N], qq[N];
 
void remove_(int i) {
	int p = pp[i], q = qq[i];
 
	if (p != -1)
		qq[p] = q;
	if (q != -1)
		pp[q] = p;
	if (p == -1 && q == -1)
		update(0, q_ - 1, INF), update(0, q_ - 1, -INF);
	else if (p == -1)
		update(0, idx(yy_, xx[q]), xx[q]);
	else if (q == -1)
		update(idx(yy_, xx[p] - 1) + 1, q_ - 1, xx[p]);
	else {
		int l = idx(yy_, xx[p] - 1) + 1, h = idx(yy_, mid(xx[p], xx[q])), r = idx(yy_, xx[q]);
 
		update(l, h, xx[p]), update(h + 1, r, xx[q]);
	}
}
 
void add(int i) {
	int p = pp[i], q = qq[i];
 
	if (p != -1)
		qq[p] = i;
	if (q != -1)
		pp[q] = i;
	if (p == -1 && q == -1)
		undo(0, q_ - 1), undo(0, q_ - 1);
	else if (p == -1)
		undo(0, idx(yy_, xx[q]));
	else if (q == -1)
		undo(idx(yy_, xx[p] - 1) + 1, q_ - 1);
	else {
		int l = idx(yy_, xx[p] - 1) + 1, h = idx(yy_, mid(xx[p], xx[q])), r = idx(yy_, xx[q]);
 
		undo(l, h), undo(h + 1, r);
	}
}
 
void append_(int i, int i_) {
	int o = eo_[i]++;
 
	if (o >= 2 && (o & o - 1) == 0)
		ei[i] = (int *) realloc(ei[i], o * 2 * sizeof *ei[i]);
	ei[i][o] = i_;
}
 
void update_(int l, int r, int i_) {
	for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) {
		if ((l & 1) == 1)
			append_(l++, i_);
		if ((r & 1) == 0)
			append_(r--, i_);
	}
}
 
int hh[Q], inv[Q], ans[Q];
 
void solve(int i) {
	int o;
 
	for (o = eo_[i]; o--; ) {
		int i_ = ei[i][o];
 
		remove_(i_);
	}
	if (i >= n_) {
		int h = i - n_;
 
		if (h < q_)
			ans[hh[h]] = query(inv[hh[h]]);
	} else
		solve(i << 1 | 0), solve(i << 1 | 1);
	for (o = 0; o < eo_[i]; o++) {
		int i_ = ei[i][o];
 
		add(i_);
	}
}
 
int main() {
	static int tt[N * 2], ii[N], ll[N], rr[N];
	static char used[N];
	int k, g, h, i;
 
	scanf("%d%d%d", &n, &k, &q_);
	for (i = 0; i < n; i++) {
		scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--;
		used[gg[i]] = 1;
	}
	for (g = 0; g < k; g++)
		if (!used[g]) {
			for (h = 0; h < q_; h++)
				printf("-1\n");
			return 0;
		}
	for (h = 0; h < q_; h++)
		scanf("%d%d", &yy[h], &tt_[h]);
	for (h = 0; h < q_; h++)
		hh[h] = h;
	compare = compareh_y, sort(hh, 0, q_);
	for (h = 0; h < q_; h++)
		yy_[h] = yy[hh[h]], inv[hh[h]] = h;
	for (i = 0; i < n; i++)
		ii[i] = i;
	compare = compare_i, sort(ii, 0, n);
	pp[ii[0]] = -1, qq[ii[n - 1]] = -1;
	ll[0] = 0, rr[n - 1] = q_ - 1;
	for (h = 0; h + 1 < n; h++)
		if (gg[ii[h]] == gg[ii[h + 1]]) {
			int h_ = idx(yy_, mid(xx[ii[h]], xx[ii[h + 1]]));
 
			qq[ii[h]] = ii[h + 1], pp[ii[h + 1]] = ii[h];
			rr[h] = h_, ll[h + 1] = h_ + 1;
		} else {
			qq[ii[h]] = -1, pp[ii[h + 1]] = -1;
			rr[h] = q_ - 1, ll[h + 1] = 0;
		}
	build();
	for (h = 0; h < n; h++)
		if (ll[h] <= rr[h])
			update(ll[h], rr[h], xx[ii[h]]);
	compare = compareh_t, sort(hh, 0, q_);
	for (h = 0; h < q_; h++)
		tt1[h] = tt_[hh[h]];
	for (i = 0; i < n; i++)
		update_(0, idx(tt1, tt[i << 1 | 0] - 1), i), update_(idx(tt1, tt[i << 1 | 1]) + 1, n_ - 1, i);
	solve(1);
	for (h = 0; h < q_; h++)
		printf("%d\n", ans[h]);
	return 0;
}

Compilation message (stderr)

new_home.c: In function 'append_':
new_home.c:188:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
  188 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
new_home.c: In function 'main':
new_home.c:231:2: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  231 |  scanf("%d%d%d", &n, &k, &q_);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:233:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  233 |   scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:243:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  243 |   scanf("%d%d", &yy[h], &tt_[h]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...