就第三个操作比较新颖

转化成 在l前插一个点

把r和r+1合并

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005,mod=20130426;
typedef long long ll;
struct Tree{
int fa,ch[2];ll add,mul,size,val;
}tr[666666];
int cnt,root,n,xx,yy,zz;ll ans,t,al;
char op[10];
void push_up(int x){
int lson=tr[x].ch[0],rson=tr[x].ch[1];
tr[x].size=tr[lson].size+tr[rson].size+1;
}
void push_down(int x){
if(!x||(tr[x].mul==1&&tr[x].add==0))return;
int lson=tr[x].ch[0],rson=tr[x].ch[1];
((tr[lson].add*=tr[x].mul)+=tr[x].add)%=mod;
((tr[rson].add*=tr[x].mul)+=tr[x].add)%=mod;
((tr[lson].val*=tr[x].mul)+=tr[x].add)%=mod;
((tr[rson].val*=tr[x].mul)+=tr[x].add)%=mod;
(tr[lson].mul*=tr[x].mul)%=mod;
(tr[rson].mul*=tr[x].mul)%=mod;
tr[x].mul=1,tr[x].add=0;
}
int build(int l,int r,int father){
if(l>r)return 0;
int pos=++cnt;
tr[pos].size=1,tr[pos].fa=father,tr[pos].mul=1;
if(l==r)return pos;
int mid=(l+r)>>1;
tr[pos].ch[0]=build(l,mid-1,pos);
tr[pos].ch[1]=build(mid+1,r,pos);
push_up(pos);
return pos;
}
void rotate(int p){
int q=tr[p].fa,y=tr[q].fa,x=(tr[q].ch[1]==p);
tr[q].ch[x]=tr[p].ch[!x];tr[tr[q].ch[x]].fa=q;
tr[p].ch[!x]=q;tr[q].fa=p;tr[p].fa=y;
if(y)tr[y].ch[tr[y].ch[1]==q]=p;
push_up(q);
}
void splay(int x,int tp){
for(int y;y=tr[x].fa;rotate(x)){
if(y==tp)break;
if(tr[y].fa!=tp){
if((tr[y].ch[0]==x)^(tr[tr[y].fa].ch[0]==y))rotate(x);
else rotate(y);
}
}push_up(x);
if(!tp)root=x;
}
void dfs(int x){
if(!x)return;
push_down(x);
dfs(tr[x].ch[0]);
if(++al>0)(ans+=t*tr[x].val)%=mod,(t*=xx)%=mod;
dfs(tr[x].ch[1]);
}
int find(int x,int sz){
push_down(x);
if(tr[tr[x].ch[0]].size+1==sz)return x;
else if(tr[tr[x].ch[0]].size>=sz)return find(tr[x].ch[0],sz);
else return find(tr[x].ch[1],sz-tr[tr[x].ch[0]].size-1);
}
int main(){
scanf("%d",&n);
root=build(0,maxn,0);
while(n--){
scanf("%s",op);
if(op[0]=='a'){
scanf("%d%d%d",&xx,&yy,&zz);
int fx=find(root,xx+1),fy=find(root,yy+3);
splay(fx,0),splay(fy,fx);
(tr[tr[fy].ch[0]].add+=zz)%=mod,(tr[tr[fy].ch[0]].val+=zz)%=mod;
push_up(fy),push_up(fx);
}
else if(op[3]=='x'){
scanf("%d%d",&xx,&yy);
int fx=find(root,yy+1),fy=find(root,yy+4);
splay(fx,0),splay(fy,fx);
push_down(fx),push_down(fy),push_down(tr[fy].ch[0]);
int now1=tr[fy].ch[0],now2=tr[now1].ch[0]+tr[now1].ch[1];
tr[now1].val+=tr[now2].val,tr[now1].size=1;
tr[now2].fa=tr[now1].ch[0]=tr[now1].ch[1]=0;
push_up(fy),push_up(fx);
fx=find(root,xx+1),fy=find(root,xx+2);
splay(fx,0),splay(fy,fx);tr[fy].ch[0]=++cnt;
tr[cnt].size=1,tr[cnt].fa=fy,tr[cnt].mul=1;
push_up(fy),push_up(fx);
}
else if(op[0]=='q'){
scanf("%d",&xx),ans=0,t=1,al=-1,dfs(root),printf("%lld\n",ans);
}
else{
scanf("%d%d%d",&xx,&yy,&zz);
int fx=find(root,xx+1),fy=find(root,yy+3);
splay(fx,0),splay(fy,fx);
(tr[tr[fy].ch[0]].mul*=zz)%=mod,(tr[tr[fy].ch[0]].val*=zz)%=mod;
(tr[tr[fy].ch[0]].add*=zz)%=mod,push_up(fy),push_up(fx);
}
}
}

最新文章

  1. 原生JS:严格模式详解
  2. 显示快照监控:/SDF/MON
  3. Maven项目在Eclipse中调试 Debug
  4. python-day6 常见算法 python内置模块
  5. hdu-----(1179)Ollivanders: Makers of Fine Wands since 382 BC.(二分匹配)
  6. mysql连接查询经典小例题
  7. Android中Universal Image Loader开源框架的简单使用
  8. Linux内核3.0移植并基于Initramfs根文件系统启动
  9. javascript第二遍基础学习笔记(一)
  10. Glossary of Terms in the JavaTM platform --reference
  11. android如何让service不被杀死
  12. 简单的UIScrollView 下拉刷新
  13. arTemplate解析语法
  14. Flex中处理多点触摸和手势
  15. HTTP常见状态码
  16. servlet 相应头重定向
  17. IIS部署网站时常见问题解决
  18. Lucky Coins Sequence
  19. 将控制台信息显示在前台页面的js插件
  20. BCD码转十进制C语言实现

热门文章

  1. the selection cannot be run on any server
  2. Android PopupWindow使用方法小结
  3. 三.Windows I/O模型之事件选择(WSAEventSelect )模型
  4. Spring AOP理解
  5. Win8.1应用开发之适配器模式(C#实现)
  6. UWP Ad
  7. nyoj56-阶乘因式分解(一)
  8. BZOJ 4712 洪水 (线段树+树剖动态维护DP)
  9. 2016年工作中遇到的问题1-10:select-for-update锁表
  10. nginx反向代理时保持长连接