弹飞绵羊
2016-06-25 22:45
405 查看
因为极度讨厌splay。。平衡树又只会treap...所以非常不想看lct...然后就只好看看分块。。。对于分块边界的加加减减一直没有统一。觉得hzwer写的这种还比较好。那就借鉴一下好了。。。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #define inf 0x7fffffff #define ll long long using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,block,cnt; int pt[200005],st[200005],K[200005],belong[200005]; int l[1005],r[1005]; inline int cal(int x) { int tmp=0; while(1) { tmp+=st[x]; if(!pt[x])break; x=pt[x]; } return tmp; } int main() { n=read();block=sqrt(n); for(int i=1;i<=n;i++) K[i]=read(); if(n%block)cnt=n/block+1; else cnt=n/block; for(int i=1;i<=cnt;i++) l[i]=(i-1)*block+1,r[i]=i*block; r[cnt]=n; for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1; for(int i=n;i>0;i--) { if(i+K[i]>n)st[i]=1; else if(belong[i]==belong[i+K[i]]) st[i]=st[i+K[i]]+1,pt[i]=pt[i+K[i]]; else st[i]=1,pt[i]=i+K[i]; } m=read(); for(int i=1;i<=m;i++) { int f=read(),x=read(),y; x++; if(f==1)printf("%d\n",cal(x)); else { y=read();K[x]=y; for(int i=x;i>=l[belong[x]];i--) if(belong[i]==belong[i+K[i]]) st[i]=st[i+K[i]]+1,pt[i]=pt[i+K[i]]; else st[i]=1,pt[i]=i+K[i]; } } return 0; }
相关文章推荐
- csdn可能待改进点之28------>手机上csdn的同步需要好久啊?
- delphi制作资源文件(一)一个A.exe释放出B.exe
- VELT-0.2.8对STM32开发的支持(3):启动代码
- 数据预处理系列:(一)从外部源获取样本数据
- select操作
- Hadoop1.2.1 出现Warning: $HADOOP_HOME is deprecated.的解决方案
- 如何配置本地本地测试APP后台服务器-apache外网访问
- Python GUI
- 小猫统计:如果视图的数据源中有视图,目前存在一个bug
- 关于ping命令的-I选项的一个问题
- 【转载】15年编程生涯,资深架构师总结的7条经验
- 盲打练习打字的感想--初体验
- Flume监控及参数调优
- memcached的安装和使用
- Python 多线程 多进程 GIL
- EffectiveJava-类和接口
- 进程管理之 atexit()函数
- Android基础知识点的整理3
- 网络LED矩阵显示器
- CSS 清除浮动的方法