Submission #69289617


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
struct elem_s {
long long tr; /* tai ryoku */
int id;
};
int cmp_elem(const struct elem_s* a, const struct elem_s* b) {
if (a->tr != b->tr) return a->tr < b->tr ? -1 : 1;
return a->id < b->id ? -1 : a->id > b->id;
}
struct pq_s {
int size, capacity;
struct elem_s* elems;
};
void pq_adjust(struct pq_s* pq, int node) {
for (;;) {
int minidx = node;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>

struct elem_s {
	long long tr; /* tai ryoku */
	int id;
};

int cmp_elem(const struct elem_s* a, const struct elem_s* b) {
	if (a->tr != b->tr) return a->tr < b->tr ? -1 : 1;
	return a->id < b->id ? -1 : a->id > b->id;
}

struct pq_s {
	int size, capacity;
	struct elem_s* elems;
};

void pq_adjust(struct pq_s* pq, int node) {
	for (;;) {
		int minidx = node;
		int i;
		for (i = 1; i <= 2; i++) {
			int c = node * 2 + i;
			if (c < pq->size && cmp_elem(&pq->elems[minidx], &pq->elems[c]) > 0) minidx = c;
		}
		if (minidx == node) {
			if (node == 0) return;
			node = (node - 1) / 2;
		} else {
			struct elem_s tmp = pq->elems[node];
			pq->elems[node] = pq->elems[minidx];
			pq->elems[minidx] = tmp;
			node = minidx;
		}
	}
}

void pq_add(struct pq_s* pq, struct elem_s elem) {
	if (pq->size >= pq->capacity) {
		pq->elems = realloc(pq->elems, sizeof(*pq->elems) * (pq->capacity = pq->size + 1));
		if (pq->elems == NULL) exit(2);
	}
	pq->elems[pq->size++] = elem;
	pq_adjust(pq, pq->size - 1);
}

struct elem_s pq_get(struct pq_s* pq) {
	struct elem_s res;
	if (pq->size <= 0) exit(42);
	res = pq->elems[0];
	if (--pq->size > 0) {
		pq->elems[0] = pq->elems[pq->size];
		pq_adjust(pq, 0);
	}
	return res;
}

struct pqd_s {
	struct pq_s data, deleted;
};

void pqd_sousai(struct pqd_s* pqd) {
	while (
		pqd->data.size > 0 &&
		pqd->deleted.size > 0 &&
		pqd->data.elems[0].tr == pqd->deleted.elems[0].tr &&
		pqd->data.elems[0].id == pqd->deleted.elems[0].id
	) {
		pq_get(&pqd->data);
		pq_get(&pqd->deleted);
	}
}

void pqd_add(struct pqd_s* pqd, struct elem_s elem) {
	pq_add(&pqd->data, elem);
}

void pqd_delete(struct pqd_s* pqd, struct elem_s elem) {
	pq_add(&pqd->deleted, elem);
}

int pqd_size(struct pqd_s* pqd) {
	return pqd->data.size - pqd->deleted.size;
}

struct elem_s pqd_peek(struct pqd_s* pqd) {
	pqd_sousai(pqd);
	if (pqd->data.size <= 0) exit(42);
	return pqd->data.elems[0];
}

struct elem_s pqd_get(struct pqd_s* pqd) {
	pqd_sousai(pqd);
	return pq_get(&pqd->data);
}

int N, Q;
int A[212345];
int event[212345], x[212345], y[212345];

struct pqd_s tr_pqd;
struct elem_s trs[212345];

int ans_cnt;
int ans[212345];

int cmp_int(const void* x, const void* y) {
	int a = *(const int*)x, b = *(const int*)y;
	return a < b ? -1 : a > b;
}

void sort_and_print_ans(void) {
	int i;
	qsort(ans, ans_cnt, sizeof(*ans), cmp_int);
	printf("%d", ans_cnt);
	for (i = 0; i < ans_cnt; i++) {
		printf(" %d", ans[i]);
	}
	putchar('\n');
}

int main(void) {
	int i;
	long long offset = 0;
	if (scanf("%d%d", &N, &Q) != 2) return 1;
	for (i = 1; i <= N; i++) {
		if (scanf("%d", &A[i]) != 1) return 1;
	}
	for (i = 0; i < Q; i++) {
		if (scanf("%d%d%d", &event[i], &x[i], &y[i]) != 3) return 1;
	}

	for (i = 1; i <= N; i++) {
		trs[i].tr = A[i];
		trs[i].id = i;
		pqd_add(&tr_pqd, trs[i]);
	}

	for (i = 0; i < Q; i++) {
		ans_cnt = 0;
		if (event[i] == 1) {
			pqd_delete(&tr_pqd, trs[x[i]]);
			trs[x[i]].tr += y[i];
			offset -= y[i];
			pqd_add(&tr_pqd, trs[x[i]]);
			while (pqd_size(&tr_pqd) > 0 && pqd_peek(&tr_pqd).tr + offset <= 0) {
				ans[ans_cnt++] = pqd_get(&tr_pqd).id;
			}
		} else if (event[i] == 2) {
			pqd_delete(&tr_pqd, trs[x[i]]);
			trs[x[i]].tr -= y[i];
			if (trs[x[i]].tr + offset > 0) {
				pqd_add(&tr_pqd, trs[x[i]]);
			} else {
				ans[ans_cnt++] = x[i];
			}
		}
		sort_and_print_ans();
	}

	return 0;
}

Submission Info

Submission Time
Task H - Attack Survival
User mikecat
Language C (gcc 12.2.0)
Score 400
Code Size 3559 Byte
Status AC
Exec Time 328 ms
Memory 17516 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 2
AC × 40
Set Name Test Cases
Sample 01_example_01.txt, 01_example_02.txt
All 01_example_01.txt, 01_example_02.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 03_max_01.txt, 03_max_02.txt, 03_max_03.txt, 03_max_04.txt, 03_max_05.txt, 03_max_06.txt, 03_max_07.txt, 03_max_08.txt, 03_max_09.txt, 03_max_10.txt, 04_small_01.txt, 04_small_02.txt, 04_small_03.txt, 04_small_04.txt, 04_small_05.txt, 04_small_06.txt, 04_small_07.txt, 04_small_08.txt, 04_small_09.txt, 04_small_10.txt, 05_corner_01.txt, 05_corner_02.txt, 05_corner_03.txt, 05_corner_04.txt, 05_corner_05.txt, 05_corner_06.txt, 05_corner_07.txt, 05_corner_08.txt
Case Name Status Exec Time Memory
01_example_01.txt AC 1 ms 1756 KiB
01_example_02.txt AC 1 ms 1628 KiB
02_random_01.txt AC 173 ms 10700 KiB
02_random_02.txt AC 90 ms 5212 KiB
02_random_03.txt AC 75 ms 8432 KiB
02_random_04.txt AC 10 ms 2592 KiB
02_random_05.txt AC 137 ms 9968 KiB
02_random_06.txt AC 127 ms 8988 KiB
02_random_07.txt AC 162 ms 11468 KiB
02_random_08.txt AC 76 ms 9308 KiB
02_random_09.txt AC 247 ms 9808 KiB
02_random_10.txt AC 81 ms 4940 KiB
03_max_01.txt AC 326 ms 12644 KiB
03_max_02.txt AC 323 ms 12628 KiB
03_max_03.txt AC 328 ms 12732 KiB
03_max_04.txt AC 325 ms 12672 KiB
03_max_05.txt AC 327 ms 12656 KiB
03_max_06.txt AC 327 ms 12644 KiB
03_max_07.txt AC 79 ms 10020 KiB
03_max_08.txt AC 79 ms 10036 KiB
03_max_09.txt AC 140 ms 17412 KiB
03_max_10.txt AC 141 ms 17512 KiB
04_small_01.txt AC 126 ms 5836 KiB
04_small_02.txt AC 145 ms 6552 KiB
04_small_03.txt AC 86 ms 4840 KiB
04_small_04.txt AC 99 ms 5908 KiB
04_small_05.txt AC 123 ms 4956 KiB
04_small_06.txt AC 144 ms 5728 KiB
04_small_07.txt AC 111 ms 8468 KiB
04_small_08.txt AC 125 ms 7460 KiB
04_small_09.txt AC 126 ms 6776 KiB
04_small_10.txt AC 109 ms 4084 KiB
05_corner_01.txt AC 104 ms 17516 KiB
05_corner_02.txt AC 105 ms 17424 KiB
05_corner_03.txt AC 138 ms 15832 KiB
05_corner_04.txt AC 138 ms 15828 KiB
05_corner_05.txt AC 128 ms 17420 KiB
05_corner_06.txt AC 130 ms 17404 KiB
05_corner_07.txt AC 79 ms 9908 KiB
05_corner_08.txt AC 79 ms 10044 KiB


2025-09-14 (Sun)
09:12:39 +09:00