Advertisement
dmkozyrev

robots3.c

Apr 26th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.06 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int t[4 * 100000];
  4. int tSet[4 * 100000];
  5. long long level = 0;
  6. int n;
  7.  
  8. int p = 1;
  9. int m[100001];
  10.  
  11. void build(int v, int vl, int vr){
  12. //  Построение узла дерева
  13.     tSet[v] = 0;
  14.     if (vl == vr) {
  15.         t[v] = 0;
  16.         return;
  17.     }
  18.     int vm = vl + (vr - vl)/2;
  19.     build(2 * v + 1, vl, vm);
  20.     build(2 * v + 2, vm+1, vr);
  21.     t[v] = t[2*v+1]+t[2*v+2];
  22. }
  23.  
  24. void push(int v, int vl, int vr) {
  25. //  Ленивое проталкивание изменений на отрезке
  26.     int vm = vl + (vr - vl) / 2;
  27.     if (tSet[v] != 0) {
  28.         t[v] = tSet[v]*(vr-vl+1);
  29.         if (vl != vr) {
  30.             tSet[2*v+1] = tSet[v];
  31.             tSet[2*v+2] = tSet[v];
  32.         }
  33.         tSet[v] = 0;
  34.     }
  35. }
  36.  
  37. int query (int v, int vl, int vr, int l, int r) {
  38. //  Запрос на получение суммы на отрезке [l, r]
  39.     push(v, vl, vr);
  40.     if (r < vl || vr < l)
  41.         return 0;
  42.     if (l <= vl && vr <= r)
  43.         return t[v];
  44.     int vm = vl + (vr - vl) / 2;
  45.     long long ql = query(2*v+1, vl, vm, l, r);
  46.     long long qr = query(2*v+2, vm+1, vr, l, r);
  47.     return ql+qr;
  48. }
  49.  
  50. void modify(int v, int vl, int vr, int l, int r, int val) {
  51. //  Запрос на изменение значений на отрезке [l, r]
  52.     push(v, vl, vr);
  53.     if (r < vl || vr < l)
  54.         return;
  55.     if (l <= vl && vr <= r) {
  56.         tSet[v] = val;
  57.         push(v, vl, vr);
  58.         return;
  59.     }
  60.     int vm = vl + (vr - vl) / 2;
  61.     modify(2*v+1, vl, vm, l, r, val);
  62.     modify(2*v+2, vm+1, vr, l, r, val);
  63.     t[v] = t[2*v+1]+t[2*v+2];
  64. }
  65.  
  66. void unbuild(int v, int vl, int vr) {
  67. //  Распаковка дерева в массив частичных сумм m за один проход
  68.     push(v, vl, vr);
  69.     if (vl == vr) {
  70.         m[p] = m[p-1]+t[v];
  71.         ++p;
  72.         return;
  73.     }
  74.     int vm = vl + (vr - vl)/2;
  75.     unbuild(2 * v + 1, vl, vm);
  76.     unbuild(2 * v + 2, vm+1, vr);
  77. }
  78.  
  79. int main() {
  80. //  freopen("in4.txt", "r", stdin);
  81. //  freopen("out.txt", "w", stdout);
  82.     int k, l, r;
  83.     scanf("%d%d%d", &n, &level, &k);
  84.     build(0, 0, n-1);
  85.     modify(0, 0, n-1, 0, level-1, -1);
  86.     modify(0, 0, n-1, level, n-1, 1);
  87.    
  88.    
  89. //  Обработка всех отрезков
  90.     while (k--) {
  91.         scanf("%d%d", &l, &r);
  92.         --l; --r;
  93.         if (l > 0 && r < n-1) { // Отрезок не касается границ
  94.             int c = query(0, 0, n-1, l, r+1)+r;
  95.             if (c-l+2 == 0) continue;
  96.             c = (c+l)/2;
  97.             modify(0, 0, n-1, l, c, 1);
  98.             modify(0, 0, n-1, c+1,r+1,-1);
  99.         } else if (l == 0) { // Отрезок касается левой границы
  100.             int b = query(0, 0, n-1, 0, r+1);
  101.             int c = r-l+2+b;
  102.             if (c == 0) continue;
  103.             modify(0, 0, n-1, 0, r+1, -1);
  104.             level += c;
  105.         } else if (r == n-1) { // ОТрезок касается правой границы
  106.             int a = query(0, 0, n-1, 0, l-1);
  107.             int c = r - l + 1 + a;
  108.             if (c == query(0, 0, n-1, 0, n-1)) continue;
  109.             modify(0, 0, n-1, l, n-1, 1);
  110.         }
  111.     }
  112.    
  113. //  Распаковка результата
  114.     m[0] = 0;
  115.     unbuild(0, 0, n-1);
  116.    
  117. //  Поиск минимума
  118.     int i, d = n;
  119.     for (i = 0; i < p; ++i)
  120.         if (d > m[i])
  121.             d = m[i];
  122.     level += d;
  123.    
  124. //  Вывод ответа
  125.     printf("%lld", level);
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement