https://codeforces.com/problemset/problem/482/B
主要是分析 & 的操作,& 实际是取交集,因此,我们如果要满足条件,就应该区间|,| 实际是取并集,我们满足每个条件,也就是区间 | 操作,然后再查询一遍是否都满足即可
线段树维护区间&,区间 | 操作
// Problem: B. Interesting Array
// Contest: Codeforces - Codeforces Round 275 (Div. 1)
// URL: https://codeforces.com/problemset/problem/482/B
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e5+9;
struct Q{
int l,r,k;
}que[N];
//线段树
struct SEG{
#define INF (1<<31)
#define ll long long
#define tl(id) (id<<1)
#define tr(id) (id<<1|1)
#define li inline
struct node{
ll val,tag;
}seg[N<<2];
li int inrange(int L,int R,int l,int r){return l<=L && R<=r;}
li int outofrange(int L,int R,int l,int r){return L>r || R<l;}
#define pushup(id) seg[id].val=seg[tl(id)].val&seg[tr(id)].val
li void build(const int id,int l,int r){
seg[id].tag=0;
if(l==r){
seg[id].val=0;
return;
}
int mid=(l+r)>>1;
build(tl(id),l,mid);
build(tr(id),mid+1,r);
pushup(id);
}
li void maketag(int id,int l,int r,ll v){
seg[id].tag|=v;
seg[id].val|=v;
}
li void pushdown(int id,int l,int r){
int mid=(l+r)>>1;
maketag(tl(id),l,mid,seg[id].tag);
maketag(tr(id),mid+1,r,seg[id].tag);
seg[id].tag=0;
}
li ll query(int id,int L,int R,int l,int r){
if(inrange(L,R,l,r)){
return seg[id].val;
}else if(!outofrange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(id,L,R);
return query(tl(id),L,mid,l,r) & query(tr(id),mid+1,R,l,r);
}else{
return (1ll<<31)-1;//返回值,不能影响答案 1&0=0
}
}
li void modify(int id,int L,int R,int l,int r,ll x){
if(inrange(L,R,l,r)){
maketag(id,L,R,x);
}else if(!outofrange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(id,L,R);
modify(tl(id),L,mid,l,r,x);
modify(tr(id),mid+1,R,l,r,x);
pushup(id);
}
}
}tr;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
tr.build(1,1,n);
for(int i=1;i<=m;i++){
int l,r,q;
cin>>l>>r>>q;
que[i]={l,r,q};
tr.modify(1,1,n,l,r,q);
}
for(int i=1;i<=m;i++){
auto t=que[i];
ll tt=tr.query(1,1,n,t.l,t.r);
if(tt!=t.k){
cout<<"NO"<<'\n';
return 0;
}
}
cout<<"YES"<<'\n';
for(int i=1;i<=n;i++){
cout<<tr.query(1,1,n,i,i)<<" ";
}
return 0;
}