This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <stdlib.h>
int max(int i, int j) { return i > j ? i : j; }
/*
* Try merge small 2 large, with persistent ds -> O(nlg^2n)
* How to maintain "frequency" of each data chunk ? ??
*
*/
#define N 120001
#define B 100
#define M 30000000
int n, q, L[M], R[M], A[M], alc, root[N], temp, freq[N];
int p2(int l, int r, int x) {
int p = ++alc;
A[p] = A[L[p]=l] + A[R[p]=r] + x;
return p;
}
int pbuild(int l, int r) {
return l == r ? ++alc : p2(pbuild(l, (l+r)/2), pbuild((l+r)/2+1, r), 0);
}
int pupd(int v, int l, int r, int p) {
if (l == r) {
if(!A[v])++freq[p];
return p2(0, 0, 1);
}
if (p <= (l+r)/2) return p2(pupd(L[v], l, (l+r)/2, p), R[v], 0);
return p2(L[v], pupd(R[v], (l+r)/2+1, r, p), 0);
}
int pqry(int v, int l, int r, int k) {
if (l == r) return l;
if (A[L[v]] < k) return pqry(R[v], (l+r)/2+1, r, k - A[L[v]]);
return pqry(L[v], l, (l+r)/2, k);
}
int ppt(int v, int l, int r, int p) {
if (l == r) return A[v];
return p <= (l+r)/2 ? ppt(L[v], l, (l+r)/2, p) : ppt(R[v], (l+r)/2+1, r, p);
}
int main() {
scanf("%d%d", &n, &q);
root[0] = pbuild(1, n);
for (int i = 1; i <= n; ++i)
root[i] = pupd(root[0], 1, n, i);
q = n + q - 1;
for (int j = 0, i = 0; i < q; ++i) {
char type[2];
int a, b;
scanf(" %s%d", type, &a);
if ('S' == type[0]) {
scanf("%d", &b);
if (A[root[a]] > A[root[b]])
temp = a, a = b, b = temp;
int tot = A[root[a]], at = 0;
while (at < tot) {
int p = pqry(root[a], 1, n, ++at);
--freq[p];
root[b] = pupd(root[b], 1, n, p);
}
root[a] = root[b];
/* delete freq in a, need to count all elem in b twice(since duplicated)
* how??*/
} else if ('Q' == type[0]) {
scanf("%d", &b);
puts(ppt(root[a], 1, n, b) ? "yes" : "no");
} else {
int z=0;for(int i=1;i<=n;++i)z+=ppt(root[i],1,n,a);
printf("%d\n", z);
}
}
}
Compilation message (stderr)
servers.c: In function 'main':
servers.c:51:12: warning: unused variable 'j' [-Wunused-variable]
51 | for (int j = 0, i = 0; i < q; ++i) {
| ^
servers.c:44:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
44 | scanf("%d%d", &n, &q);
| ^~~~~~~~~~~~~~~~~~~~~
servers.c:54:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
54 | scanf(" %s%d", type, &a);
| ^~~~~~~~~~~~~~~~~~~~~~~~
servers.c:56:7: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
56 | scanf("%d", &b);
| ^~~~~~~~~~~~~~~
servers.c:69:7: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
69 | scanf("%d", &b);
| ^~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |