区间更新,单点查询
//============================================================================
// Name : tree.cpp
// Author : Qihan
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <bits/stdc++.h>
using namespace std;
typedef long long int LLI;
typedef pair<int,int> PII;
#define pi acos(-1.0)
#define Lowbit(x) (x & (-x))
#define lson l,mid,rt << 1
#define rson mid + 1,r,rt << 1 | 1
#define inf 0x3f3f3f
#define maxn (300000 + 10)
int n,m;
struct Node {
int l,r;
int ans;
int win;
Node() {}
Node(int _l,int _r,int _ans,int _win) : l(_l),r(_r),ans(_ans),win(_win) {}
} tree[maxn << 2];
void build(int l,int r,int rt) {
tree[rt] = Node(l,r,0,0);
if(l == r) return;
int mid = (l + r) >> 1;
build(lson);
build(rson);
}
void pushdown(int rt) {
if(tree[rt].ans > 0) {
tree[rt << 1].ans = tree[rt].ans;
tree[rt << 1 | 1].ans = tree[rt].ans;
tree[rt << 1].win = tree[rt].ans;
tree[rt << 1 | 1].win = tree[rt].ans;
tree[rt].ans = 0;
}
}
void update(int l,int r,int rt,int win) {
if(tree[rt].l >= l && tree[rt].r <= r) {
tree[rt].ans = win;
return;
}
pushdown(rt);
int mid = (tree[rt].l + tree[rt].r) >> 1;
if(l <= mid) update(l,r,rt << 1,win);
if(r > mid) update(l,r,rt << 1 | 1,win);
}
int Query(int x,int rt) {
if(tree[rt].l == tree[rt].r) return tree[rt].ans;
pushdown(rt);
int mid = (tree[rt].l + tree[rt].r) >> 1;
if(x <= mid) return Query(x,rt << 1);
else return Query(x,rt << 1 | 1);
}
int l[maxn],r[maxn],win[maxn];
int main() {
// freopen("/home/qihan/Documents/in","r",stdin);
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i = 0; i < m; i ++) scanf("%d%d%d",&l[i],&r[i],&win[i]);
for(int i = m - 1; i >= 0; i --) {
if(win[i] > l[i]) update(l[i],win[i] - 1,1,win[i]);
if(win[i] < r[i]) update(win[i] + 1,r[i],1,win[i]);
}
for(int i = 1; i <= n; i ++) {
printf("%d%s",Query(i,1),i == n ? "\n" : " ");
}
return 0;
}