线段树之区间更新Interesting Array
Description
We'll call an array of n non-negative integers a[1], a[2], ..., a[n]interesting, if it meets m constraints. The i-th of the m constraints consists of three integers li, ri, qi (1 ≤ li ≤ ri ≤ n) meaning that value
should be equal to qi.
Your task is to find any interesting array of n elements or state that such array doesn't exist.
Expression x&y means the bitwise AND of numbers x and y. In programming languages C++, Java and Python this operation is represented as "&", in Pascal — as "and".
Input
The first line contains two integers n, m (1 ≤ n ≤ 105, 1 ≤ m ≤ 105) — the number of elements in the array and the number of limits.
Each of the next m lines contains three integers li, ri, qi (1 ≤ li ≤ ri ≤ n, 0 ≤ qi < 230) describing the i-th limit.
Output
If the interesting array exists, in the first line print "YES" (without the quotes) and in the second line print n integers a[1], a[2], ..., a[n] (0 ≤ a[i] < 230) decribing the interesting array. If there are multiple answers, print any of them.
If the interesting array doesn't exist, print "NO" (without the quotes) in the single line.
Sample Input
3 1
1 3 3
YES
3 3 3
3 2
1 3 3
1 3 2
NO
#include<cstdio> using namespace std; const int N=1e5+5; int f[N<<2],lazy[N<<2],le[N],ri[N],q[N]; void build(int root,int left,int right){ if(left==right){ f[root]=lazy[root]=0; return; } int mid,rt; mid=(left+right)>>1; rt=root<<1; build(rt,left,mid); build(rt+1,mid+1,right); } void pushdown(int root){ int rt=root<<1; lazy[rt]|=lazy[root]; lazy[rt+1]|=lazy[root]; f[rt]|=lazy[root]; f[rt+1]|=lazy[root]; lazy[root]=0; } void update(int root,int left,int right,int uleft,int uright,int val){ if(uleft<=left&&right<=uright){ f[root]|=val; lazy[root]|=val; return; } if(lazy[root]!=0){ pushdown(root); } int mid,rt; mid=(left+right)>>1; rt=root<<1; if(uleft<=mid){ update(rt,left,mid,uleft,uright,val); } if(uright>mid){ update(rt+1,mid+1,right,uleft,uright,val); } f[root]=f[rt]&f[rt+1]; } int query(int root,int left,int right,int qleft,int qright){ if(qleft<=left&&right<=qright){ return f[root]; } if(lazy[root]!=0){ pushdown(root); } int rt,mid,ans; ans=-1; rt=root<<1; mid=(left+right)>>1; if(qleft<=mid){ ans&=query(rt,left,mid,qleft,qright); } if(qright>mid){ ans&=query(rt+1,mid+1,right,qleft,qright); } return ans; } int main(){ int n,m,flag; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",&le[i],&ri[i],&q[i]); update(1,1,n,le[i],ri[i],q[i]); } flag=1; for(int i=1;i<=m;i++){ if(query(1,1,n,le[i],ri[i])!=q[i]){ flag=0; break; } } if(flag==1){ printf("YES\n"); for(int i=1;i<=n;i++){ printf("%d ",query(1,1,n,i,i)); } }else{ printf("NO\n"); } return 0; }

浙公网安备 33010602011771号