/* ID: espr1t TASK: KEYWORDS: */ #include #include #include #include #include using namespace std; FILE *in; FILE *out; const int MAX = 4000002; int sum[MAX], cnt[MAX]; vector nums; int getIdx(int num) { int left = 0, right = (int)nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] < num) left = mid + 1; else right = mid - 1; } return right + 1; } int next(int num) { return num / 10; // return num >= 10 ? num / 10 : -1; } void update(int val, int add) { cnt[getIdx(val)] += add; for (int step = 0; val != 0;) { val = next(val), step++; int valIdx = getIdx(val); sum[valIdx] += add * step, cnt[valIdx] += add; } } int query(int val) { int valIdx = getIdx(val); int ans = sum[valIdx], lsum = sum[valIdx], lcnt = cnt[valIdx], steps = 0; // for (; val != -1; ) { for (; val != 0; ) { val = next(val), steps++; valIdx = getIdx(val); int nsum = sum[valIdx] - lsum - lcnt; int ncnt = cnt[valIdx] - lcnt; ans += nsum + ncnt * steps; lsum = sum[valIdx], lcnt = cnt[valIdx]; } return ans; } int q[MAX][2]; int main(void) { in = stdin; out = stdout; in = fopen("hipsters.in", "rt"); out = fopen("hipsters.out", "wt"); int numQueries; fscanf(in, "%d", &numQueries); for (int i = 0; i < numQueries; i++) { fscanf(in, "%d %d", &q[i][0], &q[i][1]); for (int tmp = q[i][1]; tmp > 0; tmp /= 10) nums.push_back(tmp); } nums.push_back(0); sort(nums.begin(), nums.end()); nums.resize(unique(nums.begin(), nums.end()) - nums.begin()); for (int i = 0; i < numQueries; i++) { int type = q[i][0], val = q[i][1]; if (type == 1) { fprintf(out, "%d\n", query(val)); } else if (type == 2) { update(val, +1); } else { update(val, -1); } } return 0; }