题目传送门

弹飞绵羊

题目描述

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

输入输出格式

输入格式:

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1。

接下来一行有n个正整数,依次为那n个装置的初始弹力系数。

第三行有一个正整数m,

接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。

输出格式:

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

输入输出样例

输入样例#1:

4
1 2 1 1
3
1 1
2 1 1
1 1
输出样例#1:

2
3

说明

对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000


  分析:

  把每个装置看作一个点,然后连边,每次修改弹力值就可以看作断边和连边,可以用LCT维护。那么查询显然就直接求该点原树到根节点的距离。维护的时候比较方便,很多函数都可以省略。

  Code:

//It is made by HolseLee on 30th June 2018
//Luogu.org P3203
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int n,m,a[N],fa[N],s[N],ch[N][];
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void pushup(int x)
{
s[x]=s[ch[x][]]+s[ch[x][]]+;
}
inline bool isroot(int x)
{
return (ch[fa[x]][]!=x)&&(ch[fa[x]][]!=x);
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y];
int k=(ch[y][]==x);
int w=ch[x][k^];
if(!isroot(y))ch[z][ch[z][]==y]=x;
ch[x][k^]=y;ch[y][k]=w;
if(w)fa[w]=y;fa[y]=x;fa[x]=z;
pushup(y);
}
inline void splay(int x)
{
while(!isroot(x)){
int y=fa[x],z=fa[y];
if(!isroot(y))
((ch[y][]==x)^(ch[z][]==y))?
rotate(y):rotate(x);
rotate(x);}
pushup(x);
}
inline void access(int x)
{
for(int y=;x;x=fa[y=x])
splay(x),ch[x][]=y,pushup(x);
}
int main()
{
n=read();int x,y,z;
for(int i=;i<=n;i++){
s[i]=;x=read();
if(i+x<=n)fa[i]=i+x;}
m=read();
for(int i=;i<=m;i++){
x=read();y=read();
if(x==){
++y;
access(y);splay(y);
printf("%d\n",s[y]);
}
else{
z=read();++y;
access(y);splay(y);
ch[y][]=fa[ch[y][]]=;
if(y+z<=n)fa[y]=y+z;
pushup(y);}
}
return ;
}

最新文章

  1. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
  2. 【GOF23设计模式】备忘录模式
  3. 在Linux下给mysql创建用户并分配权限及问题解决方案
  4. RANSAC随机一致性采样算法学习体会
  5. 本地调试WordPress计划终告失败
  6. 【转】IntelliJ IDEA内存优化最佳实践
  7. 【JavaScript】AJAX教程
  8. 存储linux RAID6被重建成RAID5的数据恢复解决方案
  9. Centos部署PHP项目(安装Apache,PHP)
  10. eclipse的springboot插件
  11. [SNOI2017]一个简单的询问
  12. AngualrJS中制作一个有关菜单的Directive
  13. 31. Next Permutation (java 字典序生成下一个排列)
  14. ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
  15. android自定义控件 几种方式总结
  16. CF1096D Easy Problem(DP)
  17. 一个spring boot集成dubbo的小例子
  18. functional filter()
  19. 【转帖】基于Zookeeper的服务注册与发现
  20. Electron在Windows下的环境搭建

热门文章

  1. Spring.Net 入门学习(一)实现控制器翻转与依赖注入
  2. Dubbo 管理控制台安装
  3. dotnet core 实践——日志组件Serilog
  4. GridControl详解(一)原汁原味的表格展示
  5. Razor使用Parse()时最好指定“缓存名”
  6. C语言二分查找
  7. CentOS7 升级gcc版本
  8. F - Debate CodeForces - 1070F 思维
  9. perl6正则 5: [ ] / | / ||
  10. 使用linux下的C操作SQLLITE