我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. 初步体验javascript try catch机制

    javascript在ECMAScript3中引入了try catch finally机制,大致原理和其他语言一样. 我们也可以自定义错误事件. 但是事先声明:我们自定义的错误事件,只支持对name. ...

  2. POJ 3320

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6496   Accept ...

  3. POJ 2153 Rank List (map映射)

    水题,竟然花了那么多时间...主要是不知道为什么,明明在本机上编译过去了,但是用c++提交却编译错误...最后用g++提交AC 题意:给出n个学生的名字,然后给出m个测验. 每个测验给出n个学生的分数 ...

  4. touch事件学习

    window.onload = function(){ var touch = { movetarget : false, touchStart : function (e) { console.lo ...

  5. 视频转换工具 Transmageddon

    点这里 Transmageddon 是一个采用 Python 语言开发的视频转换工具,支持输出几乎所有的视频格式,同时也可以生成指定平台下的视频格式. 软件界面如下图所示

  6. POJ 2127

    #include <iostream> #define MAXN 501 using namespace std; int a[MAXN],b[MAXN],ans[MAXN]; int G ...

  7. Node 出现 uncaughtException 之后的优雅退出方案

    Node 的异步特性是它最大的魅力,但是在带来便利的同时也带来了不少麻烦和坑,错误捕获就是一个.由于 Node 的异步特性,导致我们无法使用 try/catch 来捕获回调函数中的异常,例如: try ...

  8. Eclipse Java EE 编译器设置JSP默认编码

    在windows-preferences-web-jsp files-encoding那里设置默认编码.如下图所示:

  9. jquery easyUi 配置默认页码

    jquery easyUI用pagenation 属性如果修改其默认加载页面显示,配置该怎样写? 注意区分datagrid的pagenation分页的区别,代码如下. if ($.fn.paginat ...

  10. Linux下Boost交叉编译

    http://davidlwq.iteye.com/blog/1580752 运行环境:ubuntu 12.04, boost 1.50.0 由于要把boost移植到arm板上去,所以折腾了一下,后来 ...