Submission #434073

#TimeUsernameProblemLanguageResultExecution timeMemory
434073rainboyRegions (IOI09_regions)C11
35 / 100
3232 ms17136 KiB
#include <stdio.h>
#include <stdlib.h>

#define N	200000
#define R	25000
#define K	450
#define S	450

int ta[N], tb[N];

int main() {
	static int pp[N], rr[N], qu[N], uu[N], dd[N], *iii[R], kk[R], ss[R], uuu[S][R], ddd[S][R];
	int n, r_, q, r, s, i, j;

	scanf("%d%d%d", &n, &r_, &q);
	for (i = 0; i < n; i++) {
		if (i > 0)
			scanf("%d", &pp[i]), pp[i]--;
		scanf("%d", &rr[i]), rr[i]--;
		kk[rr[i]]++;
	}
	for (i = n - 1; i >= 0; i--) {
		tb[i]++;
		if (i > 0)
			tb[pp[i]] += tb[i];
	}
	for (i = 0; i < n; i++) {
		if (i == 0)
			ta[i] = 0, tb[i] = 1;
		else
			ta[i] = tb[pp[i]], tb[pp[i]] += tb[i];
		qu[ta[i]] = i;
		tb[i] = ta[i] + 1;
	}
	for (r = 0, s = 0; r < r_; r++)
		if (kk[r] >= K) {
			ss[r] = s;
			for (i = 0; i < n; i++) {
				uu[i] = (i == 0 ? 0 : uu[pp[i]]) + (rr[i] == r);
				dd[i] = rr[i] == r;
			}
			for (i = n - 1; i > 0; i--)
				dd[pp[i]] += dd[i];
			for (i = 0; i < n; i++)
				uuu[s][rr[i]] += uu[i], ddd[s][rr[i]] += dd[i];
			s++;
		}
	for (r = 0; r < r_; r++)
		iii[r] = (int *) malloc(kk[r] * sizeof *iii[r]), kk[r] = 0;
	for (i = 0; i < n; i++) {
		r = rr[qu[i]];
		iii[r][kk[r]++] = qu[i];
	}
	while (q--) {
		int r1, r2;

		scanf("%d%d", &r1, &r2), r1--, r2--;
		if (kk[r1] >= K)
			printf("%d\n", uuu[ss[r1]][r2]);
		else if (kk[r2] >= K)
			printf("%d\n", ddd[ss[r2]][r1]);
		else {
			int h1, h2, ans, cnt;

			ans = 0, cnt = 0;
			for (h1 = 0, h2 = 0; h2 < kk[r2]; h2++) {
				j = iii[r2][h2];
				while (cnt && tb[qu[cnt - 1]] <= ta[j])
					cnt--;
				while (h1 < kk[r1] && ta[i = iii[r1][h1]] <= ta[j]) {
					if (ta[j] < tb[i])
						qu[cnt++] = i;
					h1++;
				}
				ans += cnt;
			}
			printf("%d\n", ans), fflush(stdout);
		}
	}
	return 0;
}

Compilation message (stderr)

regions.c: In function 'main':
regions.c:15:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |  scanf("%d%d%d", &n, &r_, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.c:18:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |    scanf("%d", &pp[i]), pp[i]--;
      |    ^~~~~~~~~~~~~~~~~~~
regions.c:19:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |   scanf("%d", &rr[i]), rr[i]--;
      |   ^~~~~~~~~~~~~~~~~~~
regions.c:57:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |   scanf("%d%d", &r1, &r2), r1--, r2--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...