Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string.h>
- #include <math.h>
- #include <iomanip>
- #include <vector>
- #include <algorithm>
- #include <map>
- #include <set>
- #include <numeric>
- #include <stack>
- #include <deque>
- #include <queue>
- #define f first
- #define s second
- #define pipii pair<int, pair<int, int> >
- #define mp make_pair
- using namespace std;
- typedef long long ll;
- //const int INF = 1e9 + 7;
- #define INF 0x3F3F3F3F
- #define MAX 100010
- struct node
- {
- int min, id, add;
- } t[4*MAX];
- void build(int v, int l, int r){
- if (l == r)
- t[v].id = l;
- else {
- int mid = (l + r) / 2;
- build(v + v, l, mid);
- build(v + v + 1, mid + 1, r);
- t[v].id = t[v + v].id;
- }
- }
- void push(int v, int l, int mid, int r){
- int up = t[v].add;
- if (up){
- t[v + v].min += up;
- t[v + v].add += up;
- t[v + v + 1].min += up;
- t[v + v + 1].add += up;
- t[v].add = 0;
- }
- }
- void upd(int v, int tl, int tr, int l, int r, int val){
- if (l > r) return;
- if (l == tl && tr == r)
- {
- t[v].min += val;
- t[v].add += val;
- return;
- }
- int mid = (tl + tr) / 2;
- push(v, tl, mid, tr);
- upd(v + v, tl, mid, l, min(mid, r), val);
- upd(v + v + 1, mid + 1, tr, max(mid + 1, l), r, val);
- if (t[v + v].min <= t[v + v + 1].min)
- {
- t[v].min = t[v + v].min;
- t[v].id = t[v + v].id;
- }
- else {
- t[v].min = t[v + v + 1].min;
- t[v].id = t[v + v + 1].id;
- }
- }
- pair<int, int> get(int v, int tl, int tr, int l, int r){
- if (l > r) return mp(INF, 0);
- if (tl == l && tr == r)
- return mp(t[v].min, t[v].id);
- int mid = (tl + tr) / 2;
- push(v, tl, mid, tr);
- pair<int, int> a = get(v + v, tl, mid, l, min(mid, r));
- pair<int, int> b = get(v + v + 1, mid + 1, tr, max(l, mid + 1), r);
- return min(a, b);
- }
- int l[MAX], r[MAX], c[MAX], res[MAX];
- int main(){
- int n, m;
- scanf("%d %d", &n, &m);
- memset(t,0,sizeof(t));
- for (int i = 1; i <= m; i++)
- scanf("%d %d %d", &l[i], &r[i], &c[i]);
- build(1, 1, n);
- for (int i = m; i >= 1; i --){
- if (c[i] == 0)
- upd(1, 1, n, l[i], r[i], 1);
- else
- {
- while(1)
- {
- pair<int, int> p = get(1, 1, n, l[i], r[i]);
- if (p.f > 0) break;
- res[p.s] = c[i];
- upd(1, 1, n, p.s, p.s, INF);
- }
- upd(1, 1, n, l[i], r[i], -1);
- }
- }
- for (int i = 1; i <= n; i++)
- printf("%d ", res[i]);
- printf("\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement