我TM再也不写BIT套主席树了。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 200500
#define maxe 200500
using namespace std;
int n,m,q,type,x,y,g[maxv],nume=,dfn[maxv],mx[maxv],fdfn[maxv],dis[maxv],anc[maxv][],times=;
int root[maxv*],sum[maxv*],tot=,ls[maxv*],rs[maxv*];
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
int lowbit(int x)
{
return (x&(-x));
}
void dfs(int x,int fath)
{
dfn[x]=++times;fdfn[times]=x;mx[x]=dfn[x];
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath)
{
anc[v][]=x;dis[v]=dis[x]+;
dfs(v,x);
mx[x]=max(mx[x],mx[v]);
}
}
}
void build(int &now,int left,int right)
{
now=++tot;sum[now]=;
if (left==right) return;
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void get_table()
{
for (int e=;e<=;e++)
for (int i=;i<=n;i++)
anc[i][e]=anc[anc[i][e-]][e-];
}
int lca(int x,int y)
{
if (dis[x]<dis[y]) swap(x,y);
if (dis[x]!=dis[y])
{
for (int e=;e>=;e--)
{
if ((dis[anc[x][e]]>=dis[y]) && (anc[x][e]))
x=anc[x][e];
}
}
if (x==y) return x;
for (int e=;e>=;e--)
{
if (anc[x][e]!=anc[y][e])
{
x=anc[x][e];
y=anc[y][e];
}
}
return anc[x][];
}
int find(int x,int pos)
{
for (int e=;e>=;e--)
if (dis[anc[x][e]]>dis[pos])
x=anc[x][e];
return x;
}
void modify(int last,int x,int pos,int val)
{
root[x]=++tot;
int now=root[x];sum[now]=sum[last]+val;
int left=,right=n;
while (left<right)
{
int mid=(left+right)>>;
ls[now]=ls[last];rs[now]=rs[last];
if (pos<=mid)
{
ls[now]=++tot;
sum[ls[now]]=sum[ls[last]]+val;
now=ls[now];last=ls[last];right=mid;
}
else
{
rs[now]=++tot;
sum[rs[now]]=sum[rs[last]]+val;
now=rs[now];last=rs[last];left=mid+;
}
}
}
void add(int x,int pos,int val)
{
for (int i=x;i<=n;i+=lowbit(i))
modify(root[i],i,pos,val);
}
void build_tree()
{
build(root[],,n);
for (int i=;i<=n;i++)
{
root[i]=++tot;
ls[root[i]]=ls[root[i-]];rs[root[i]]=rs[root[i-]];
}
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(dfn[x],dfn[y],);
add(dfn[y],dfn[x],);
}
}
int ask(int now,int left,int right,int l,int r)
{
if ((left==l) && (right==r))
return sum[now];
int mid=(left+right)>>;
if (r<=mid) return ask(ls[now],left,mid,l,r);
else if (l>=mid+) return ask(rs[now],mid+,right,l,r);
else return ask(ls[now],left,mid,l,mid)+ask(rs[now],mid+,right,mid+,r);
}
int ask_(int now,int left,int right)
{
int ret=;
for (int i=now;i>=;i-=lowbit(i))
ret+=ask(root[i],,n,left,right);
return ret;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n-;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);addedge(y,x);
}
dfs(,);
get_table();
build_tree();
scanf("%d",&q);
for (int i=;i<=q;i++)
{
scanf("%d%d%d",&type,&x,&y);
if (type==)
{
add(dfn[x],dfn[y],);
add(dfn[y],dfn[x],);
}
else if (type==)
{
add(dfn[x],dfn[y],-);
add(dfn[y],dfn[x],-);
}
else
{
int t=lca(x,y);
if (t==y)
{
int r=find(x,y);
int ret1=ask_(mx[x],,n)-ask_(dfn[x]-,,n);
int ret2=ask_(mx[x],dfn[r],mx[r])-ask_(dfn[x]-,dfn[r],mx[r]);
printf("%d\n",ret1-ret2);
}
else if (t==x)
{
int r=find(y,x);
int ret1=ask_(n,dfn[y],mx[y]);
int ret2=ask_(mx[r],dfn[y],mx[y])-ask_(dfn[r]-,dfn[y],mx[y]);
printf("%d\n",ret1-ret2);
}
else
printf("%d\n",ask_(mx[x],dfn[y],mx[y])-ask_(dfn[x]-,dfn[y],mx[y]));
}
}
return ;
}

BZOJ 4285 使者的更多相关文章

  1. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. 在线API文档

    http://www.ostools.net/apidocs A Ace akka2.0.2 Android Ant Apache CXF Apache HTTP服务器 ASM字节码操作 AutoCo ...

  2. PHP一些函数

     函数不定参数: func_num_args // 获得参数个数 func_get_args // 获得参数数组 call_user_func('function_name', $parameter) ...

  3. POJ 1969

    #include <iostream> #include <cmath> using namespace std; int main() { //freopen("a ...

  4. Spring mvc json null

    http://blog.csdn.net/zdsdiablo/article/details/9429263

  5. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  6. 传说中的WCF(2):服务协定的那些事儿

    上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了.首先,敢于 ...

  7. BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配

    1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...

  8. SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-001-Spring对原始JDBC的封装

    1.spring扩展的jdbc异常 2.Template的运行机制 Spring separates the fixed and variable parts of the data-access p ...

  9. JavaWeb项目开发案例精粹-第6章报价管理系统-07View层

    1. 2.back_index.html <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT= ...

  10. Scala模式匹配和类型系统

    1.模式匹配比java中的switch case强大很多,除了值,类型,集合等进行匹配,最常见的Case class进行匹配,Master.scala有大量的模式匹配. Case "_&qu ...