Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <string>
- #include <vector>
- #include <queue>
- #include <iostream>
- #include <cmath>
- #include <sstream>
- #include <map>
- #include <set>
- #include <numeric>
- #include <memory.h>
- #include <cstdio>
- #include <assert.h>
- using namespace std;
- #define pb push_back
- #define INF 1011111111
- #define FOR(i, a, b) for (int _n(b), i(a); i < _n; i++)
- #define rep(i, n) FOR(i, 0, n)
- #define CL(a, v) memset((a), (v), sizeof(a))
- #define mp make_pair
- #define X first
- #define Y second
- #define all(c) (c).begin(), (c).end()
- #define SORT(c) sort(all(c))
- typedef long long ll;
- typedef vector<int> VI;
- typedef pair<int, int> pii;
- /*** TEMPLATE CODE ENDS HERE */
- const int maxn = (1 << 17) + 10;
- int trie[maxn][2];
- int sum[maxn];
- int tail[16];
- int trie2[maxn][2];
- int sum2[maxn];
- void increment(int x, int by, int tr[maxn][2], int sm[maxn], int &size) {
- int at = 0;
- for (int i = 15; i >= 0; --i) {
- int bt = (x >> i) & 1;
- if (tr[at][bt] == -1) {
- tr[at][bt] = size++;
- }
- at = tr[at][bt];
- sm[at] += by;
- }
- }
- int dfs(int at, int x, int pos, int tr[maxn][2], int sm[maxn]) {
- if (at == -1) {
- return 0;
- }
- if (pos == -1) {
- return sm[at];
- }
- if (at && (x & tail[pos]) == tail[pos]) {
- return sm[at];
- }
- int bt = (x >> pos) & 1;
- int s = 0;
- rep(i, 2) {
- if ((i & bt) == i) {
- s += dfs(tr[at][i], x, pos - 1, tr, sm);
- }
- }
- return s;
- }
- int reverse(int x) {
- int y = 0;
- for (int i = 0; i <= 15; ++i) {
- y |= ((x >> i) & 1) << (15 - i);
- }
- return y;
- }
- int main() {
- #ifdef LOCAL_HOST
- freopen("input.txt", "r", stdin);
- // freopen("output.txt","w",stdout);
- #endif
- CL(trie, -1);
- rep(i, 17) if (i) tail[i - 1] = (1 << i) - 1;
- CL(trie2, -1);
- int Q;
- scanf("%d", &Q);
- char s[16];
- int x;
- int size = 1;
- int size2 = 1;
- while (Q--) {
- scanf("%s %d", s, &x);
- if (s[0] == 'a') {
- increment(x, 1, trie, sum, size);
- x = reverse(x);
- increment(x, 1, trie2, sum2, size2);
- } else if (s[0] == 'd') {
- increment(x, -1, trie, sum, size);
- x = reverse(x);
- increment(x, -1, trie2, sum2, size2);
- } else {
- int y = reverse(x);
- int cx = 0, cy = 0;
- rep(i, 15) {
- if ((x & tail[i]) == tail[i]) {
- cx = i;
- }
- if ((y & tail[i]) == tail[i]) {
- cy = i;
- }
- }
- if (cx >= cy) {
- int s = dfs(0, x, 15, trie, sum);
- printf("%d\n", s);
- } else {
- int s = dfs(0, y, 15, trie2, sum2);
- printf("%d\n", s);
- }
- }
- }
- #ifdef LOCAL_HOST
- printf("TIME: %.3lf\n", double(clock()) / CLOCKS_PER_SEC);
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment