比较套路的题目。

可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数。

每个点都在动态修改 这意味着我们的只能暴力的去查每个点。

考虑将所有可以动态修改的点变成静态的 这样查询好查 那么外部需要一个动态的标记 且这个标记适用于所有点。

不难想到我们的循环标记i 即第i次操作 将这个东西变成每个点的标记 就可以刚好和题目中的动态修改吻合了。

一个点此刻被打上动态修改标记 那么其权值的变化量为-i 因为外面有一个+i的标记了 这个标记时刻也在变和题目吻合。

此时我们需要处理的只有树上某个点权值会变树上某条路径上>x的点的个数。

只能考虑主席树了(发现这个问题还不是很好解决

dfs序上建立主席树 利用对LCA的容斥即可解决问题。

由于存在单点修改 外面套一个树状数组即可。码量过大 不妨考虑离线。

考虑一个没有被修改过的点 其实不需要赋值相当于没有即可。

考虑我们询问的形式为 当前时间 x+now>c c-now-x now-c>i 也就是查询now-c之前被修改过的点。

对于一个询问 now-c来说我们考虑之后被修改过的点至少为now+1 而由于c>0 所以now-c<now+1.

所以后面的修改对前面的没有任何的影响所以可以直接 树上建立主席树来离线查询。

数据范围 是简化程序的基础。

//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define pii pair<int,int>
#define F first
#define S second
#define mk make_pair
#define RE register
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define ull unsigned long long
#define P 1000000000000000ll
#define l(p) t[p].l
#define r(p) t[p].r
#define sum(p) t[p].sum
#define ls l(p),l,mid
#define rs r(p),mid+1,r
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=200010;
int n,len,id,m,cnt;
int a[MAXN],root[MAXN];
int f[MAXN][20],Log[MAXN],d[MAXN];
int lin[MAXN],ver[MAXN],nex[MAXN];
struct wy{int l,r;int sum;}t[MAXN*30],w[MAXN];
inline void add(int x,int y){ver[++len]=y;nex[len]=lin[x];lin[x]=len;}
inline void insert(int &p,int l,int r,int las,int x)
{
p=++id;t[p]=t[las];
if(l==r){++sum(p);return;}
int mid=(l+r)>>1;
if(x<=mid)insert(ls,l(las),x);
else insert(rs,r(las),x);
sum(p)=sum(l(p))+sum(r(p));
}
inline void dfs(int x,int fa)
{
d[x]=d[fa]+1;
rep(1,Log[d[x]],i)f[x][i]=f[f[x][i-1]][i-1];
if(a[x])insert(root[x],1,m,root[fa],a[x]);
else root[x]=root[fa];
go(x)dfs(tn,x);
}
inline int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
fep(Log[d[x]],0,i)if(d[f[x][i]]>=d[y])x=f[x][i];
if(x==y)return x;
fep(Log[d[x]],0,i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
inline int ask(int p,int l,int r,int x)
{
if(x<=0)return 0;
if(r<=x)return sum(p);
int mid=(l+r)>>1;
if(x<=mid)return ask(ls,x);
return ask(ls,x)+ask(rs,x);
}
int main()
{
//freopen("1.in","r",stdin);
get(n);int rt;Log[0]=-1;
rep(1,n,i)
{
f[i][0]=read();
if(!f[i][0])rt=i;
else add(f[i][0],i);
Log[i]=Log[i>>1]+1;
}
get(m);
rep(1,m,i)
{
int op,l,r,x;
get(op);get(l);
if(op==1)get(r),get(x),w[++cnt]=(wy){l,r,i-x};
else a[l]=i;
}
dfs(rt,0);
rep(1,cnt,i)
{
int lca=LCA(w[i].l,w[i].r);
int L=w[i].l,R=w[i].r;
int ww=w[i].sum-1;
//cout<<-ask(root[lca],1,m,ww)*2<<endl;
//put(ask(root[L],1,m,ww));
printf("%d %d\n",d[L]+d[R]-2*d[lca]+1,ask(root[L],1,m,ww)+ask(root[R],1,m,ww)-ask(root[lca],1,m,ww)*2+(a[lca]<=ww&&a[lca]));
}
return 0;
}

最新文章

  1. react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置
  2. 关于判断checkbox选中问题
  3. javascript创建对象的几种方式
  4. Android http 的使用
  5. 【XLL API 函数】xlSheetId
  6. 揭开HTTP网络协议神秘面纱系列(一)
  7. Linux文件系统的主要目录结构说明及分区方案
  8. hdu 4081 Qin Shi Huang&#39;s National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest
  9. Quartz+JAVA+Servlet实现任务调度系统(简洁)
  10. C#如何生成缩略图、水印
  11. Javascript继承5:如虎添翼----寄生式继承
  12. Python2018-列表的相关操作
  13. 字节顺序标记——BOM,Byte Order Mark
  14. WCF分布式服务1-核心概念
  15. React-state props与render()的关系
  16. 显示定位方法,提取中间text 封装成函数的方法
  17. HDU 6126.Give out candies 最小割
  18. 以python代码解释fork系统调用
  19. JavaScript 浏览器对象模型 (BOM)
  20. PHP 设计模式系列 —— 资源库模式(Repository)

热门文章

  1. HDU3686 Traffic Real Time Query System 题解
  2. Jmeter系列(41)- Jmeter + Ant +Jenkins 持续集成
  3. 实现new关键字
  4. C#联合WINCC之数据通信
  5. python数据处理(二)之处理Excel文件
  6. python数据处理(九)之自动化与规模化
  7. 数据可视化基础专题(六):Pandas基础(五) 索引和数据选择器(查找)
  8. 数据分析02 /pandas基础
  9. Go的100天之旅-03变量
  10. 【RPA Starter第二课】Introduction to the UiPath Enterprise Platform UiPath企业平台简介