Advertisement
Malinovsky239

Untitled

Jan 17th, 2012
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define mp make_pair
  8. #define N int(5e5 + 5)
  9. #define INF int(1e9)
  10.  
  11. int tree[4 * N], k, n, sz = 1, res[N];
  12.  
  13. void build() {
  14.     while (sz < k) sz *= 2;
  15.     for (int i = sz; i < sz + k; i++)
  16.         tree[i] = i - sz + 1;
  17.     for (int i = sz + k; i < sz * 2; i++)
  18.         tree[i] = INF;
  19.     for (int i = sz - 1; i; i--)
  20.         tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
  21. }
  22.  
  23. void update(int v, int val) {
  24.     v += sz - 1;
  25.     tree[v] = val; 
  26.     v /= 2;
  27.     while (v) {
  28.         tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
  29.         v /= 2;
  30.     }
  31. }
  32.  
  33. struct train {
  34.     int timer, ch, num;
  35.  
  36.     train() {}
  37.  
  38.     train(int a, int b, int c) {
  39.         timer = a, ch = b, num = c;
  40.     }
  41. };
  42.  
  43. bool operator < (train a, train b) {
  44.     if (a.timer == b.timer)
  45.         return a.ch < b.ch;
  46.     return a.timer < b.timer;
  47. }
  48.  
  49. train a[2 * N];
  50.                                                      
  51. int main() {
  52.     freopen("trains.in", "r", stdin);
  53.     freopen("trains.out", "w", stdout);
  54.  
  55.     while (scanf("%d %d ", &k, &n) != -1) {
  56.         build();
  57.  
  58.         for (int i = 0; i < n; i++) {
  59.             int in, out;
  60.             scanf("%d %d ", &in, &out);
  61.             a[i * 2] = train(in, 0, i + 1);
  62.             a[i * 2 + 1] = train(out, 1, i + 1);
  63.         }
  64.  
  65.         sort(a, a + 2 * n);
  66.  
  67.         bool ex = false;
  68.  
  69.         for (int i = 0; i < 2 * n; i++) {
  70.             if (a[i].ch) {
  71.                 update(res[ a[i].num ], res[ a[i].num ]);
  72.             }
  73.             else {
  74.                 if (tree[1] == INF) {
  75.                     printf("0 %d\n", a[i].num);
  76.                     ex = true;
  77.                     break;
  78.                 }
  79.                 res[ a[i].num ] = tree[1];
  80.                 update(tree[1], INF);
  81.             }
  82.         }
  83.                          
  84.         if (ex) continue;
  85.  
  86.         for (int i = 1; i <= n; i++)
  87.             printf("%d\n", res[i]);
  88.     }
  89.  
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement