Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.Scanner;
- public class Main {
- private static int[] t;
- private static int newN;
- private static void setSum(int i) {
- t[i] = t[i * 2 + 1] + t[i * 2 + 2];
- }
- private static void update(int pos, int value) {
- int v = pos - 1 + newN;
- t[v] = value;
- while (v > 0) {
- v = (v - 1) / 2;
- setSum(v);
- }
- }
- public static void main(String[] args) {
- try (Scanner in = new Scanner(new FileReader("parking.in"));
- BufferedWriter writer = new BufferedWriter(new FileWriter("parking.out"))) {
- // Scanner in = new Scanner(System.in);
- int n = in.nextInt();
- in.nextInt();
- newN = getNewN(n);
- t = new int[newN * 2 - 1];
- // храним кол-во свободных мест
- // build
- for (int i = 0; i < n; i++)
- t[newN - 1 + i] = 1;
- for (int i = newN - 2; i >= 0; i--)
- setSum(i);
- //
- while (in.hasNext()) {
- String str = in.next();
- if (str.equals("enter")) {
- int pos = in.nextInt() - 1;
- int v = pos - 1 + newN;
- if (t[v] == 0) {
- int q = getVOfMinFirstEmptyRange(0, 0, newN - 1, pos + 1, newN - 1);
- if (q == -1) {
- q = getVOfMinFirstEmptyRange(0, 0, newN - 1, 0, pos - 1);
- }
- q = getVOfLeaveByQ(q);
- pos = q + 1 - newN;
- }
- update(pos, 0);
- System.out.println(pos + 1);
- writer.write(pos + 1 + "" + '\n');
- } else {
- // exit
- update(in.nextInt() - 1, 1);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private static int getVOfLeaveByQ(int q) {
- while (q * 2 + 2 < t.length) {
- q = q * 2 + 1;
- if (t[q] == 0) q++;
- }
- return q;
- }
- private static int getVOfMinFirstEmptyRange(int v, int left, int right, int a, int b) {
- if (a > right || b < left) return -1;
- if (a == left && b == right) {
- if (t[v] > 0) {
- return v;
- } else {
- return -1;
- }
- }
- int mid = (left + right) / 2;
- int leftVToRet = getVOfMinFirstEmptyRange(v * 2 + 1, left, mid, a, Math.min(b, mid));
- if (leftVToRet != -1) return leftVToRet;
- return getVOfMinFirstEmptyRange(v * 2 + 2, mid + 1, right, Math.max(a, mid + 1), b);
- }
- private static int getNewN(int n) {
- int res = 1;
- while (res < n)
- res <<= 1;
- return res;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement