树链剖分,用zkw线段树维护每条链两个方向上对每一位的变换情况,由于位数较少,可以用两个unsigned long long表示

#include<cstdio>
typedef unsigned long long u64;
const int N=;
char buf[N*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
u64 _u64(){
u64 x=;
int c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int es[N*],enx[N*],e0[N],ep=,tp[N];
u64 v[N];
int fa[N],sz[N],top[N],dep[N],son[N],id[N],idp=,idr[N];
int n,m,k;
u64 vs[][];
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
}
}
}
void f2(int w,int tp){
top[w]=tp;
id[w]=++idp;
idr[idp]=w;
if(son[w])f2(son[w],tp);
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&u!=son[w])f2(u,u);
}
}
int s1[],p1,s2[],p2,s3[],s4[],p3,p4;
void find(int l,int r,int tp){
p1=p2=;
for(l+=,r+=;r-l!=;l>>=,r>>=){
if(~l&)s1[p1++]=l^;
if(r&)s2[p2++]=r^;
}
if(!tp){
for(int i=;i<p2;++i)s4[p4++]=s2[i];
while(p1)s4[p4++]=s1[--p1];
}else{
for(int i=;i<p2;++i)s3[p3++]=s2[i];
while(p1)s3[p3++]=s1[--p1];
}
}
#define cal(a,b,c0,c1) (a)=((~(b)&(c0))|((b)&(c1)))
void init(int w,int tp,u64 v){
u64*a=vs[w];
if(tp==){
a[]=a[]=0ll&v;
a[]=a[]=-1ll&v;
}else if(tp==){
a[]=a[]=0ll|v;
a[]=a[]=-1ll|v;
}else if(tp==){
a[]=a[]=0ll^v;
a[]=a[]=-1ll^v;
}
}
void up(u64*a,u64*l,u64*r){
cal(a[],l[],r[],r[]);
cal(a[],l[],r[],r[]);
cal(a[],r[],l[],l[]);
cal(a[],r[],l[],l[]);
}
u64 _v0,_v1;
void get(int x,int y){
p3=p4=;
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b]){
find(id[a],id[x],);
x=fa[a],a=top[x];
}else{
find(id[b],id[y],);
y=fa[b],b=top[y];
}
}
if(dep[x]>dep[y]){
find(id[y],id[x],);
}else{
find(id[x],id[y],);
}
u64 v0=0ll,v1=-1ll;
for(int i=;i<p4;++i){
u64*a=vs[s4[i]];
cal(v0,v0,a[],a[]);
cal(v1,v1,a[],a[]);
}
while(p3){
u64*a=vs[s3[--p3]];
cal(v0,v0,a[],a[]);
cal(v1,v1,a[],a[]);
}
_v0=v0,_v1=v1;
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
n=_();m=_();k=_();
for(int i=;i<=n;++i){
tp[i]=_();
v[i]=_u64();
}
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
f1(,);f2(,);
for(int i=;i<=n;++i)init(id[i]+,tp[i],v[i]);
for(int i=;i;--i)up(vs[i],vs[i<<],vs[i<<|]);
for(int i=;i<m;++i){
int o=_(),x=_(),y=_();
u64 z=_u64();
if(o==){
get(x,y);
u64 r=,r0,r1;
for(int i=;i>=;--i)if((r|1llu<<i)<=z){
cal(r0,r,_v0,_v1);
cal(r1,(r|1llu<<i),_v0,_v1);
if(r0<r1)r|=1llu<<i;
}
cal(r0,r,_v0,_v1);
printf("%llu\n",r0);
}else{
init(id[x]+,tp[x]=y,v[x]=z);
for(int w=id[x]+>>;w!=;w>>=)up(vs[w],vs[w<<],vs[w<<^]);
}
}
return ;
}

bzoj 4811: [Ynoi2017]由乃的OJ的更多相关文章

  1. BZOJ 4811 [Ynoi2017]由乃的OJ ——Link-Cut Tree

    直接维护按照顺序经过每一段,初始的1可以变成什么,初始为0可以变成什么. 然后答案就可以和起床困难综合征一样贪心处理了. 写起来并不好写. 发现交换左右子树之后答案会改变,GG 调了一天,最后还是T掉 ...

  2. bzoj 4811 由乃的OJ

    bzoj 4811 由乃的OJ 考虑树链剖分. 树剖后用一颗线段树维护一段连续区间,类似于一个函数,各位上进入 \(0/1\) ,输出的数字分别是什么.注意到最多只有 \(64\) 位,可以用一个 \ ...

  3. 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树

    [BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...

  4. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  5. BZOJ4811 [Ynoi2017]由乃的OJ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分/LCT+贪心

    Description 给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示. 每次询问包含三个数x,y,z,初始选定一个数v.然后v依 ...

  7. BZOJ 4810 [Ynoi2017]由乃的玉米田 (莫队 + bitset)

    题目链接  BZOJ 4810 首先对询问离线, 莫队算法处理. 首先我们可以用bitset维护处当前区间中是否存在某个数. 对于询问1, 我们可以用 ((f >> q[i].x) &am ...

  8. bzoj4811 [Ynoi2017]由乃的OJ 树链剖分+位运算

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4811 因为位运算的结果有可合并性,所以可以树链剖分,线段树维护: 细节很多,特别要注意从左往 ...

  9. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

随机推荐

  1. 为何linux(包括mac系统)执行指令要加上 ./ ??

    比如,现在要在$HIVE_HOME/bin下执行hive指令来启动hive,则该指令的执行顺序如下所示: 1 先找PATH路径 1.1 如果PATH路径下配置了$HIVE_HOME/bin,无论PAT ...

  2. <<操作,&0xff以及|的巧妙运用(以POJ3523---The Morning after Halloween(UVa 1601)为例)

    <<表示左移,如a<<1表示将a的二进制左移一位,加一个0,&0xff表示取最后8个字节,如a&0xff表示取a表示的二进制中最后8个数字组成一个新的二进制数, ...

  3. window cmd-常用命令

    1.常用命令 dir 文件列表 cd 改变目录md 创建目录 rd 删除目录 type 显示文件内容 fc 比较目录 attrib 修改文件属性 copy 复制文件 del 删除文件 ren 文件改名 ...

  4. OS模块(与操作系统交互)

    os 模块提供了很多允许你的程序与操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() ...

  5. java exception 01

    问题:java.util.concurrentmodificationexception 背景:java thread 网上找到的出现的例子如下(项目中真实的code不便给出) public clas ...

  6. Python中msgpack库的使用

    msgpack用起来像json,但是却比json快,并且序列化以后的数据长度更小,言外之意,使用msgpack不仅序列化和反序列化的速度快,数据传输量也比json格式小,msgpack同样支持多种语言 ...

  7. MVC框架的理解(配置文件一次编写,所有的java代码都可以运行)

  8. pgbench 安装试用

    pgbench 是一个方便的pg 性能测试工具,以下是简单的测试试用 安装 安装pg yum install https://download.postgresql.org/pub/repos/yum ...

  9. 几个方便的nodejs 任务调度框架

    摘录几个方便的nodejs 任务调度包 node-cron https://github.com/kelektiv/node-cron node-schedule https://github.com ...

  10. sqler sql 转rest api 数据校验的处理

    早期版本(2.0 之前)使用rules 进行数据校验处理,2.0 之后进行了修改使用 validators,这样更加明确 参考格式   addpost {    // if any rule retu ...