我们只需将序列分成 n\sqrt{n}n​ 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号。在查询时,我们最多会跳 n\sqrt{n}n​ 块,修改的时候将节点所在区间暴力修改即可。
Code:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 2000000 + 3;
int arr[maxn], n, block, to[maxn], val[maxn], m, belong[maxn];
struct Data_Structure{
inline void init(){
block = sqrt(n);
for(int i = n;i >= 1; --i)
{
belong[i] = (i - 1) / block + 1;
to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
}
}
inline int solve(){
int pos, ans = 0;
scanf("%d",&pos);
++pos;
while(pos <= n){
ans += val[pos];
pos = to[pos];
}
return ans;
}
inline void update(){
int pos, data;
scanf("%d%d",&pos,&data);
++pos;
arr[pos] = data;
for(int i = min(belong[pos] * block, n); i >= (belong[pos] - 1) * block + 1; --i)
{
to[i] = belong[i + arr[i]] == belong[i] ? to[i + arr[i]] : i + arr[i];
val[i] = belong[i + arr[i]] == belong[i] ? val[i + arr[i]] + 1 : 1;
}
}
}T;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n; ++i) scanf("%d",&arr[i]);
T.init();
scanf("%d",&m);
while(m--)
{
int opt;
scanf("%d",&opt);
switch(opt)
{
case 1:
{
printf("%d\n", T.solve());
break;
}
case 2:
{
T.update();
break;
}
}
}
return 0;
}

  

最新文章

  1. sc.WholeTextFiles与sc.textFile区别
  2. SQL查询包含汉字的行
  3. Oracle数据库基础知识_字符串操作相关2
  4. JQuery动态增加删除元素
  5. Linux epoll总结
  6. PMP:6.项目进度管理
  7. 异常处理汇总 ~ 修正果带着你的Code飞奔吧!
  8. ubuntu 禁用自带的nouveau显卡驱动,安装NVIDIA显卡驱动
  9. webpack 打包产生的文件名中,hash、chunkhash、contenthash 的区别
  10. encode()、decode()字符编码问题
  11. 028 Partitioner:数据分区器
  12. EBS管理员为供应商创建新联系人流程
  13. (回文串 Manacher )Girls&#39; research -- hdu -- 3294
  14. (转)解决dubbox-demo-provider.xml报错的问题:提示Failed to read schema document
  15. GO_00:Mac之Item2的配置安装
  16. 给洛谷填坑的spj……
  17. MySQL order null 0 - 把null和0(零)排在最后
  18. 简单的 Android 菜单
  19. HDU 6280 From Tree to Graph(2018 湘潭邀请 E题,树的返祖边)
  20. KM算法讲解

热门文章

  1. c# rc4算法,加密解密类
  2. 【摘录】JAVA内存管理-自动选择垃圾收集器算法
  3. Codeforces Round #284 (Div. 2) A
  4. 一个APP开发有那么难吗?
  5. Python安装遇到的问题
  6. BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)
  7. linux内核(四)内存管理单元MMU
  8. LeetCode104_MaximumDepthofBinaryTree Java题解
  9. HDU 4336
  10. 强名称程序集(strong name assembly)——为程序集赋予强名称