Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <iomanip>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <map>
  10. #include <set>
  11. #include <numeric>
  12. #include <stack>
  13. #include <deque>
  14. #include <queue>
  15. #define f first
  16. #define s second
  17. #define pipii pair<int, pair<int, int> >
  18. #define mp make_pair
  19. using namespace std;
  20.  
  21. typedef long long ll;
  22. //const int INF = 1e9 + 7;
  23. #define INF 0x3F3F3F3F
  24. #define MAX 100010
  25. struct node
  26. {
  27.     int min, id, add;
  28. } t[4*MAX];
  29.  
  30. void build(int v, int l, int r){
  31.     if (l == r)
  32.         t[v].id = l;
  33.     else {
  34.         int mid = (l + r) / 2;
  35.         build(v + v, l, mid);
  36.         build(v + v + 1, mid + 1, r);
  37.         t[v].id = t[v + v].id;
  38.     }
  39. }
  40. void push(int v, int l, int mid, int r){
  41.     int up = t[v].add;
  42.     if (up){
  43.         t[v + v].min += up;
  44.         t[v + v].add += up;
  45.         t[v + v + 1].min += up;
  46.         t[v + v + 1].add += up;
  47.         t[v].add = 0;
  48.     }
  49. }
  50. void upd(int v, int tl, int tr, int l, int r, int val){
  51.     if (l > r) return;
  52.     if (l == tl && tr == r)
  53.     {
  54.         t[v].min += val;
  55.         t[v].add += val;
  56.         return;
  57.     }
  58.     int mid = (tl + tr) / 2;
  59.     push(v, tl, mid, tr);
  60.     upd(v + v, tl, mid, l, min(mid, r), val);
  61.     upd(v + v + 1, mid + 1, tr, max(mid + 1, l), r, val);
  62.     if (t[v + v].min <= t[v + v + 1].min)
  63.     {
  64.         t[v].min = t[v + v].min;
  65.         t[v].id = t[v + v].id;
  66.     }
  67.     else {
  68.         t[v].min = t[v + v + 1].min;
  69.         t[v].id = t[v + v + 1].id;
  70.     }
  71.    
  72. }
  73. pair<int, int> get(int v, int tl, int tr, int l, int r){
  74.     if (l > r) return mp(INF, 0);
  75.     if (tl == l && tr == r)
  76.         return mp(t[v].min, t[v].id);
  77.     int mid = (tl + tr) / 2;
  78.     push(v, tl, mid, tr);
  79.     pair<int, int> a = get(v + v, tl, mid, l, min(mid, r));
  80.     pair<int, int> b = get(v + v + 1, mid + 1, tr, max(l, mid + 1), r);
  81.     return min(a, b);
  82. }
  83. int l[MAX], r[MAX], c[MAX], res[MAX];
  84. int main(){
  85.     int n, m;
  86.     scanf("%d %d", &n, &m);
  87.     memset(t,0,sizeof(t));
  88.     for (int i = 1; i <= m; i++)
  89.         scanf("%d %d %d", &l[i], &r[i], &c[i]);
  90.     build(1, 1, n);
  91.     for (int i = m; i >= 1; i --){
  92.         if (c[i] == 0)
  93.             upd(1, 1, n, l[i], r[i], 1);
  94.         else
  95.         {
  96.             while(1)
  97.             {
  98.                 pair<int, int> p = get(1, 1, n, l[i], r[i]);
  99.                 if (p.f > 0) break;
  100.                 res[p.s] = c[i];
  101.                 upd(1, 1, n, p.s, p.s, INF);
  102.             }
  103.             upd(1, 1, n, l[i], r[i], -1);
  104.         }
  105.     }
  106.     for (int i = 1; i <= n; i++)
  107.         printf("%d ", res[i]);
  108.     printf("\n");
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement