样例都没过,竟然能够拿 10 分,这还是意想不到的。
代码:
#include<bits/stdc++.h>
#define MAXN 1000010
using namespace std;
struct node{
int l,r,w;
}que[MAXN];
struct Node{
int val,lazy;
}tree[MAXN<<2];
int n,q,p,a[MAXN],b[MAXN],ans[MAXN],lson[MAXN],rson[MAXN];
inline void push_down(int root){
const int lazy=tree[root].lazy;
tree[root<<1].lazy|=lazy;
tree[root<<1].val|=lazy;
tree[root<<1|1].lazy|=lazy;
tree[root<<1|1].val|=lazy;
tree[root].lazy=0;
}
void change(int root,int l,int r,int L,int R,int val){
if(L<=l&&r<=R){
tree[root].lazy|=val;
tree[root].val|=val;
return;
}
int mid=(l+r)>>1;
push_down(root);
if(L<=mid){
change(root<<1,l,mid,L,R,val);
}
if(mid<R){
change(root<<1|1,mid+1,r,L,R,val);
}
}
int query(int root,int l,int r,int Q){
if(l==r){
return tree[root].val;
}
int mid=(l+r)>>1;
push_down(root);
if(Q<=mid){
return query(root<<1,l,mid,Q);
}
return query(root<<1|1,mid+1,r,Q);
}
void modify(int root,int l,int r,int Q,int val){
if(l==r){
tree[root].val=val;
return;
}
int mid=(l+r)>>1;
push_down(root);
if(Q<=mid){
modify(root<<1,l,mid,Q,val);
}else{
modify(root<<1|1,mid+1,r,Q,val);
}
}
void solve(int l,int r,int L,int R){
if(l>r){
return;
}
if(L==R){
for(int i=l;i<=r;++i){
ans[b[i]]=L;
}
return;
}
int mid=(L+R)>>1,ltop=0,rtop=0;
for(int i=L;i<=mid;++i){
change(1,1,n,que[i].l,que[i].r,que[i].w);
}
for(int i=l;i<=r;++i){
int sum=query(1,1,n,b[i]);
if((sum|a[b[i]])<=p){
rson[++rtop]=b[i];
change(1,1,n,b[i],b[i],sum);
}else{
lson[++ltop]=b[i];
}
}
// cout<<l<<" "<<r<<":"<<endl<<"lson:";
for(int i=1;i<=ltop;++i){
b[i+l-1]=lson[i];
// cout<<lson[i]<<" ";
}
// cout<<endl<<"rson:";
for(int i=1;i<=rtop;++i){
b[i+l+ltop-1]=rson[i];
// cout<<rson[i]<<" ";
}
// cout<<endl;
solve(l,l+ltop-1,L,mid);
solve(l+ltop,r,mid+1,R);
}
int main(){
scanf("%d %d %d",&n,&q,&p);
que[q+1]=((node){1,n,p});
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
b[i]=i;
}
for(int i=1;i<=q;++i){
scanf("%d %d %d",&que[i].l,&que[i].r,&que[i].w);
}
solve(1,n,1,q+1);
for(int i=1;i<=n;++i){
printf("%d ",ans[i]==q+1?-1:ans[i]);
}
return 0;
}