Submission #72998191


Source Code Expand

#include <stdio.h>
#include <stdlib.h>

int cmp(const void* x, const void* y) {
	int a = *(const int*)x, b = *(const int*)y;
	return (a > b) - (a < b);
}

int zac;
int zal[114514 * 3];

int zaq(int query) {
	int l = 0, r = zac - 1;
	while (l <= r) {
		int m = l + (r - l) / 2;
		if (zal[m] == query) return m;
		else if (zal[m] < query) l = m + 1;
		else r = m - 1;
	}
	printf("ERROR: %d not found!\n", query);
	exit(72);
}

/* 範囲1をadd、点get */

#define KI_MAX (1 << 19) /* 524288 */

struct ki_node {
	int delta;
	int children[2];
};

#define POOL_MAX 5200000

int pool_count;
struct ki_node pool[POOL_MAX];

int create_new_node(int from) {
	if (pool_count >= POOL_MAX) {
		puts("MLE!");
		exit(42);
	}
	if (from >= 0) {
		pool[pool_count] = pool[from];
	} else {
		pool[pool_count].delta = 0;
		pool[pool_count].children[0] = -1;
		pool[pool_count].children[1] = -1;
	}
	return pool_count++;
}

int ki_add_i(int node, int ss, int se, int qs, int qe) {
	if (qs <= ss && se <= qe) { /* セグメントがクエリに完全に含まれる */
		int new_node = create_new_node(node);
		pool[new_node].delta++;
		return new_node;
	} else if (se <= qs || qe <= ss) { /* 完全に外れている */
		return node;
	} else {
		int sm = ss + (se - ss) / 2;
		int new_node = create_new_node(node);
		pool[new_node].children[0] = ki_add_i(pool[new_node].children[0], ss, sm, qs, qe);
		pool[new_node].children[1] = ki_add_i(pool[new_node].children[1], sm, se, qs, qe);
		return new_node;
	}
}

int ki_add(int node, int qs, int qe) {
	return ki_add_i(node, 0, KI_MAX, qs, qe);
}

int ki_get_i(int node, int ss, int se, int q) {
	if (node < 0) { /* このノードとその子孫は全て0 */
		return 0;
	} else if (ss == q && se == q + 1) { /* セグメントがクエリに完全に含まれる (葉) */
		return pool[node].delta;
	} else if (q < ss || se <= q) { /* 完全に外れている */
		return 0;
	} else {
		int sm = ss + (se - ss) / 2;
		return pool[node].delta +
			ki_get_i(pool[node].children[0], ss, sm, q) +
			ki_get_i(pool[node].children[1], sm, se, q);
	}
}

int ki_get(int node, int q) {
	return ki_get_i(node, 0, KI_MAX, q);
}

int n, m, k;
int a[114514], b[114514];
int p[114514], q[114514], r[114514];

int data[114514];

int main(void) {
	int i;
	if (scanf("%d%d%d", &n, &m, &k) != 3) return 1;
	for (i = 1; i <= n; i++) {
		if (scanf("%d%d", &a[i], &b[i]) != 2) return 1;
		zal[i * 2 - 2] = a[i];
		zal[i * 2 - 1] = b[i];
	}
	for (i = 0; i < m; i++) {
		if (scanf("%d%d%d", &p[i], &q[i], &r[i]) != 3) return 1;
		zal[n * 2 + i] = p[i];
	}
	qsort(zal, n * 2 + m, sizeof(*zal), cmp);
	for (i = 1, zac = 1; i < n * 2 + m; i++) {
		if (zal[zac - 1] != zal[i]) zal[zac++] = zal[i];
	}
	data[0] = -1;
	for (i = 1; i <= n; i++) {
		data[i] = ki_add(data[i - 1], zaq(a[i]), zaq(b[i]) + 1);
	}
	for (i = 0; i < m; i++) {
		int id = zaq(p[i]);
		printf("%d\n", ki_get(data[r[i]], id) - ki_get(data[q[i] - 1], id));
	}
	return 0;
}

Submission Info

Submission Time
Task typhoon - 台風 (Typhoon)
User mikecat
Language C23 (GCC 14.2.0)
Score 100
Code Size 3070 Byte
Status AC
Exec Time 325 ms
Memory 63208 KiB

Judge Result

Set Name Set01 Set02 Set03 Set04 Set05 Set06 Set07 Set08 Set09 Set10
Score / Max Score 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
Set01 01
Set02 02
Set03 03
Set04 04
Set05 05
Set06 06
Set07 07
Set08 08
Set09 09
Set10 10
Case Name Status Exec Time Memory
01 AC 2 ms 2200 KiB
02 AC 72 ms 29548 KiB
03 AC 158 ms 46932 KiB
04 AC 114 ms 30032 KiB
05 AC 309 ms 63188 KiB
06 AC 222 ms 63076 KiB
07 AC 218 ms 46992 KiB
08 AC 310 ms 63208 KiB
09 AC 325 ms 63104 KiB
10 AC 97 ms 30204 KiB