要求一个区间内的数相与等于一个值 那就是说这个值的某个二进制位如果是1 那这个区间内所有数对应为都要是1 即对区间内每一个数都做或运算 线段树维护一下 如果是0 那这个区间内所有数对应为至少有一个0 不用管
q次都更新完以后 再统一把每个区间都查询一下 看是否和一开始给定的值一样 不一样则说明有矛盾
#include <bits/stdc++.h>
using namespace std;
struct node1
{
int l;
int r;
int val;
int laz;
};
struct node2
{
int l;
int r;
int val;
};
node1 tree[400010];
node2 order[100010];
int n,q;
void build(int l,int r,int cur)
{
int m;
tree[cur].l=l;
tree[cur].r=r;
tree[cur].val=0;
tree[cur].laz=0;
if(l==r) return;
m=(l+r)/2;
build(l,m,2*cur);
build(m+1,r,2*cur+1);
}
void pushup(int cur)
{
tree[cur].val=tree[2*cur].val&tree[2*cur+1].val;
}
void pushdown(int cur)
{
if(tree[cur].laz)
{
tree[2*cur].val|=tree[cur].laz;
tree[2*cur].laz|=tree[cur].laz;
tree[2*cur+1].val|=tree[cur].laz;
tree[2*cur+1].laz|=tree[cur].laz;
tree[cur].laz=0;
}
}
void update(int pl,int pr,int val,int cur)
{
if(pl<=tree[cur].l&&tree[cur].r<=pr)
{
tree[cur].val|=val;
tree[cur].laz|=val;
return;
}
pushdown(cur);
if(pl<=tree[2*cur].r) update(pl,pr,val,2*cur);
if(pr>=tree[2*cur+1].l) update(pl,pr,val,2*cur+1);
pushup(cur);
}
int query(int pl,int pr,int cur)
{
int res;
if(pl<=tree[cur].l&&tree[cur].r<=pr)
{
return tree[cur].val;
}
pushdown(cur);
res=1073741823;
if(pl<=tree[2*cur].r) res&=query(pl,pr,2*cur);
if(pr>=tree[2*cur+1].l) res&=query(pl,pr,2*cur+1);
return res;
}
int main()
{
int i,l,r,val,flag;
scanf("%d%d",&n,&q);
build(1,n,1);
for(i=1;i<=q;i++)
{
scanf("%d%d%d",&order[i].l,&order[i].r,&order[i].val);
update(order[i].l,order[i].r,order[i].val,1);
}
flag=1;
for(i=1;i<=q;i++)
{
if(query(order[i].l,order[i].r,1)!=order[i].val)
{
flag=0;
break;
}
}
if(flag)
{
printf("YES\n");
for(i=1;i<=n;i++)
{
printf("%d ",query(i,i,1));
}
printf("\n");
}
else printf("NO\n");
return 0;
}