Description

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

Input

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

Output

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

Sample Input

4
1 2 1 1
3
1 1
2 1 1
1 1

Sample Output

2
3

把每个点像弹到的点连边,显然可得出一棵树。
而x能弹几下显然就是x到树中在序列中最靠右的点的路径的size
可是如果维护森林的话,很难知道这个splay中最大的是哪一个
为了方便把弹飞的都连接到n+1点上,那么x弹的次数就是x到n+1的路径的size-1
查询和修改操作详见代码

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #define N (200000+100)
  5. using namespace std;
  6. int Father[N],Son[N][],Size[N],Rev[N];
  7. int n,m,a[N];
  8.  
  9. int Get(int x) {return Son[Father[x]][]==x;}
  10. int Is_root(int x) {return Son[Father[x]][]!=x && Son[Father[x]][]!=x;}
  11. void Update(int x) {Size[x]=Size[Son[x][]]+Size[Son[x][]]+;}
  12.  
  13. void Rotate(int x)
  14. {
  15. int wh=Get(x);
  16. int fa=Father[x],fafa=Father[fa];
  17. if (!Is_root(fa)) Son[fafa][Son[fafa][]==fa]=x;
  18. Father[fa]=x; Son[fa][wh]=Son[x][wh^];
  19. Father[x]=fafa; Son[x][wh^]=fa;
  20. if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
  21. Update(fa); Update(x);
  22. }
  23.  
  24. void Pushdown(int x)
  25. {
  26. if (Rev[x] && x)
  27. {
  28. if (Son[x][]) Rev[Son[x][]]^=;
  29. if (Son[x][]) Rev[Son[x][]]^=;
  30. swap(Son[x][],Son[x][]);
  31. Rev[x]=;
  32. }
  33. }
  34.  
  35. void Push(int x)
  36. {
  37. if (!Is_root(x)) Push(Father[x]);
  38. Pushdown(x);
  39. }
  40.  
  41. void Splay(int x)
  42. {
  43. Push(x);
  44. for (int fa;!Is_root(x);Rotate(x))
  45. if (!Is_root(fa=Father[x]))
  46. Rotate(Get(fa)==Get(x)?fa:x);
  47. }
  48.  
  49. void Access(int x) {for (int y=;x;y=x,x=Father[x]) Splay(x),Son[x][]=y,Update(x);}
  50. void Make_root(int x) {Access(x); Splay(x); Rev[x]^=;}
  51. int Find_root(int x) {Access(x); Splay(x); while (Son[x][]) x=Son[x][]; return x;}
  52. void Link(int x,int y) {Make_root(x); Father[x]=y;}
  53. void Cut(int x,int y) {Make_root(x); Access(y); Splay(y); Father[x]=Son[y][]=;}
  54. void Query(int x) {Make_root(n+); Access(x); Splay(x); printf("%d\n",Size[x]-);}
  55. void Change(int x,int y) {Cut(x,x+a[x]<=n?x+a[x]:n+); Link(x,x+y<=n?x+y:n+); a[x]=y;}
  56.  
  57. int main()
  58. {
  59. int opt,x,y;
  60. scanf("%d",&n);
  61. for (int i=;i<=n;++i)
  62. {
  63. scanf("%d",&a[i]);
  64. if (i+a[i]<=n) Link(i,i+a[i]);
  65. else Link(i,n+);
  66. }
  67. scanf("%d",&m);
  68. for (int i=;i<=m;++i)
  69. {
  70. scanf("%d",&opt);
  71. if (opt==) scanf("%d",&x),Query(x+);
  72. if (opt==) scanf("%d%d",&x,&y),Change(x+,y);
  73. }
  74. }

2002. [HNOI2010]弹飞绵羊【LCT】的更多相关文章

  1. [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)

    [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...

  2. [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)

    题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...

  3. 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]

    题目传送门 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...

  4. P3203 [HNOI2010]弹飞绵羊(LCT)

    弹飞绵羊 题目传送门 解题思路 LCT. 将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\).从\(j\)弹飞需要的次数就是\(sp ...

  5. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  6. BZOJ.2002.Bounce 弹飞绵羊(LCT)

    题目链接 从一个点只能往后跳,即后继状态只有一个,那么拿nxt[x]做fa[x]啊!这样就成了一棵树,从每个点开始的答案是它到所在树的根节点的距离. nxt[]的更改即动态修改树边,用LCT即可. 这 ...

  7. P3203 [HNOI2010]弹飞绵羊(LCT)

    P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...

  8. bzoj 2002 Bounce 弹飞绵羊

    bzoj 2002 Bounce 弹飞绵羊 设一个虚拟节点表示被弹飞,则每个点的后继点是唯一确定的,每个点向它的后继点连边,就形成了一颗树. 询问就是问某个节点到虚拟节点的路径长度,修改就删除原来向后 ...

  9. [HNOI2010] 弹飞绵羊 (分块)

    [HNOI2010] 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上 ...

随机推荐

  1. JS数组sort比较函数

    转载:http://www.cnblogs.com/ljchow/archive/2010/06/30/1768683.html 我们知道,数组的sort方法可以对数组元素进行排序,默认是按ASCII ...

  2. 三:Jquery-event

    一:jq中事件 1.页面载入事件 ready()方法 格式: $(document).ready(function(){}); $(function(){}); 2.绑定事件 click(),dblc ...

  3. 《码出高效 Java开发手册》第四章 走进JVM(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  4. 【基于初学者的SSH】struts2 环境配置

    01:导入Jar包 下载地址:http://struts.apache.org/ 将下好的jar包放导WEB-INF下的lib文件夹下 02:创建Action:com.action.LoginActi ...

  5. 13、springboot之jpa

    导入包,不多说 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  6. CSS 媒体查询创建响应式网站

    使用 CSS 媒体查询创建响应式网站  适用于所有屏幕大小的设计 固定宽度的静态网站很快被灵活的响应式设计所取代,该设计可以根据屏幕大小进行上扩和下扩.利用响应式设计,无论您采用什么设备或屏幕来访问网 ...

  7. webpack2引入bootstrap的坑

    在webpack官网教程的代码分离-css章节中,给出的例子是这样的. //安装 ExtractTextWebpackPlugin 如下 npm install --save-dev extract- ...

  8. window.open('') 火狐,IE事件冒泡处理,点击事件冒泡处理

    window.open('') 火狐,IE事件冒泡处理,点击事件冒泡处理 写PC下拉菜单的时候,hover样式显示下拉菜单,可能会这样写 <li class="xb_li1" ...

  9. JavaScript小细节点罗列(1)

    共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...

  10. linux 安装 zookeeper 集群

    关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.servicesystemctl status firewalld ...