Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- struct SegmentTree {
- std::vector<int> sum;
- int n;
- SegmentTree(int m) {
- n = 1;
- while (n < m) n *= 2;
- sum.assign(2 * n, 0);
- }
- int getSum(int left, int right) {
- --right;
- left += n;
- right += n;
- int ret = 0;
- while (left <= right) {
- if ((left & 1) == 1) {
- ret += sum[left++];
- }
- if ((right & 1) == 0) {
- ret += sum[right--];
- }
- left >>= 1;
- right >>= 1;
- }
- return ret;
- }
- int getNext(int x) {
- int k = getSum(0, x) + 1;
- if (getSum(0, n) < k) {
- k = 1;
- }
- int v = 1;
- int left = 0;
- int right = n;
- while (left < right - 1) {
- int mid = (left + right) >> 1;
- if (sum[2 * v] >= k) {
- right = mid;
- v = 2 * v;
- } else {
- k -= sum[2 * v];
- left = mid;
- v = 2 * v + 1;
- }
- }
- return left;
- }
- void add(int x, int y) {
- x += n;
- sum[x] += y;
- while (x > 1) {
- x >>= 1;
- sum[x] = sum[2 * x] + sum[2 * x + 1];
- }
- }
- };
- int main() {
- std::ifstream fin("parking.in");
- std::ofstream fout("parking.out");
- int n, m;
- fin >> n >> m;
- SegmentTree tree(n);
- for (int i = 0; i < n; i++) tree.add(i, 1);
- for (int i = 0; i < m; i++) {
- std::string s;
- int x;
- fin >> s >> x;
- --x;
- if (s == "enter") {
- int id = tree.getNext(x);
- tree.add(id, -1);
- fout << id + 1 << '\n';
- } else {
- tree.add(x, 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment