睡觉困难综合征

为什么每次数据结构题主程序都写挂

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
typedef unsigned long long u64;
struct func{
    u64 a,b;
    inline func(u64 x=-1ull,u64 y=0){a=x,b=y;}
    inline u64 operator()(u64 x)const{return(x&a)|(~x&b);}
    inline func operator()(func x)const{return func(x(a),x(b));}
};
int n,m,k;
const auto getxor = [](u64 x){return func(~x,x);};
const auto getand = [](u64 x){return func(x,0);};
const auto getor = [](u64 x){return func(-1ull,x);};
const int maxn = 100100;
func v[maxn],sum1[maxn],sum2[maxn];
int son[maxn][2],fa[maxn],tag[maxn],st[maxn],top;
inline int get(int x,int p=1){return son[fa[x]][p]==x;}
inline int is_root(int x){return!(get(x)||get(x,0));}
inline void up(int x){
    sum1[x]=sum1[son[x][0]](v[x])(sum1[son[x][1]]);
    sum2[x]=sum2[son[x][1]](v[x])(sum2[son[x][0]]);
}
inline void puttag(int x){if(x)std::swap(sum1[x],sum2[x]),tag[x]^=1;}
inline void down(int x){
    if(tag[x]){
        std::swap(son[x][1],son[x][0]);
        puttag(son[x][1]),puttag(son[x][0]);
        tag[x]=0;
    }
}
inline void rotate(int x){
    int y=fa[x],z=fa[y],b=get(x);
    if(!is_root(y))son[z][get(y)]=x;
    son[y][b]=son[x][!b],son[x][!b]=y;
    fa[son[y][b]]=y,fa[y]=x,fa[x]=z;
    up(y),up(x);
}
inline void splay(int x){
    st[top=1]=x;
    for(int y=x;!is_root(y);st[++top]=y=fa[y]);
    for(;top;--top)down(st[top]);
    for(;!is_root(x);rotate(x))
        if(!is_root(fa[x]))rotate(get(x)^get(fa[x])?x:fa[x]);
    up(x);
}
inline void access(int x){for(int t=0;x;son[x][1]=t,t=x,x=fa[x])splay(x);}
inline void make_root(int x){access(x),splay(x),puttag(x);}
inline void split(int x,int y){make_root(x),access(y),splay(y);}
std::vector<int>e[maxn];
int vis[maxn];
inline void dfs(int x){vis[x]=1;for(int i:e[x])if(!vis[i])fa[i]=x,dfs(i);}
int main(){
    std::ios::sync_with_stdio(false),std::cin.tie(0);
    std::cin >> n >> m >> k;
    for(int i=1;i<=n;++i){
        int a;u64 b;
        std::cin >> a >> b;
        if(a==1)v[i]=getand(b);
        if(a==2)v[i]=getor(b);
        if(a==3)v[i]=getxor(b);
        up(i);
    }
    for(int i=1,x,y;i<n;++i)
        std::cin>>x>>y,e[x].push_back(y),e[y].push_back(x);
    dfs(1);
    for(int i=1;i<=m;++i){
        int q,x,y;u64 z;
        std::cin >> q >> x >> y >> z;
        if(q==1){
            split(x,y);
            func o = sum1[y];
            u64 res=0;
            for(int i=63;~i;--i)
                if(o(res|1ull<<i)>o(res)&&(res|1ull<<i)<=z)res|=1ull<<i;
            std::cout << o(res) << '\n';
        }else{
            make_root(x);
            if(y==1)v[x]=getand(z);
            if(y==2)v[x]=getor(z);
            if(y==3)v[x]=getxor(z);
            up(x);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/skip1978/p/10353150.html