Advertisement
IzhanVarsky

Untitled

Mar 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.93 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5.     private static int[] t;
  6.     private static int newN;
  7.  
  8.     private static void setSum(int i) {
  9.         t[i] = t[i * 2 + 1] + t[i * 2 + 2];
  10.     }
  11.  
  12.     private static void update(int pos, int value) {
  13.         int v = pos - 1 + newN;
  14.         t[v] = value;
  15.         while (v > 0) {
  16.             v = (v - 1) / 2;
  17.             setSum(v);
  18.         }
  19.     }
  20.  
  21.     public static void main(String[] args) {
  22.         try (Scanner in = new Scanner(new FileReader("parking.in"));
  23.              BufferedWriter writer = new BufferedWriter(new FileWriter("parking.out"))) {
  24. //        Scanner in = new Scanner(System.in);
  25.             int n = in.nextInt();
  26.             in.nextInt();
  27.             newN = getNewN(n);
  28.             t = new int[newN * 2 - 1];
  29.             // храним кол-во свободных мест
  30.             // build
  31.             for (int i = 0; i < n; i++)
  32.                 t[newN - 1 + i] = 1;
  33.             for (int i = newN - 2; i >= 0; i--)
  34.                 setSum(i);
  35.             //
  36.             while (in.hasNext()) {
  37.                 String str = in.next();
  38.                 if (str.equals("enter")) {
  39.                     int pos = in.nextInt() - 1;
  40.                     int v = pos - 1 + newN;
  41.                     if (t[v] == 0) {
  42.                         int q = getVOfMinFirstEmptyRange(0, 0, newN - 1, pos + 1, newN - 1);
  43.                         if (q == -1) {
  44.                             q = getVOfMinFirstEmptyRange(0, 0, newN - 1, 0, pos - 1);
  45.                         }
  46.                         q = getVOfLeaveByQ(q);
  47.                         pos = q + 1 - newN;
  48.                     }
  49.                     update(pos, 0);
  50.                     System.out.println(pos + 1);
  51.                     writer.write(pos + 1 + "" + '\n');
  52.                 } else {
  53.                     // exit
  54.                     update(in.nextInt() - 1, 1);
  55.                 }
  56.             }
  57.         } catch (IOException e) {
  58.             e.printStackTrace();
  59.         }
  60.     }
  61.  
  62.     private static int getVOfLeaveByQ(int q) {
  63.         while (q * 2 + 2 < t.length) {
  64.             q = q * 2 + 1;
  65.             if (t[q] == 0) q++;
  66.         }
  67.         return q;
  68.     }
  69.  
  70.     private static int getVOfMinFirstEmptyRange(int v, int left, int right, int a, int b) {
  71.         if (a > right || b < left) return -1;
  72.         if (a == left && b == right) {
  73.             if (t[v] > 0) {
  74.                 return v;
  75.             } else {
  76.                 return -1;
  77.             }
  78.         }
  79.         int mid = (left + right) / 2;
  80.         int leftVToRet = getVOfMinFirstEmptyRange(v * 2 + 1, left, mid, a, Math.min(b, mid));
  81.         if (leftVToRet != -1) return leftVToRet;
  82.         return getVOfMinFirstEmptyRange(v * 2 + 2, mid + 1, right, Math.max(a, mid + 1), b);
  83.     }
  84.  
  85.  
  86.     private static int getNewN(int n) {
  87.         int res = 1;
  88.         while (res < n)
  89.             res <<= 1;
  90.         return res;
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement