fhqtreap

其实fhqtreap只有可持久化之后才用新建节点。。。

reverse和splay一样。

//#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = ;
int n, root, cnt, m, last;
int size[N], tag[N], a[], rnd[N];
int child[N][];
ll mn[N], add[N], key[N];
void update(int x)
{
size[x] = size[child[x][]] + size[child[x][]] + ;
mn[x] = min(key[x], min(mn[child[x][]], mn[child[x][]]));
}
void pushdown(int x)
{
if(!x) return;
if(add[x])
{
add[child[x][]] += add[x];
add[child[x][]] += add[x];
mn[child[x][]] += add[x];
mn[child[x][]] += add[x];
key[child[x][]] += add[x];
key[child[x][]] += add[x];
add[x] = ;
}
if(tag[x])
{
tag[child[x][]] ^= ;
tag[child[x][]] ^= ;
swap(child[x][], child[x][]);
tag[x] = ;
}
}
int newnode(int x)
{
++cnt;
size[cnt] = ;
rnd[cnt] = rand();
key[cnt] = x;
mn[cnt] = x;
return cnt;
}
int copy(int x)
{
++cnt;
size[cnt] = size[x];
rnd[cnt] = rnd[x];
tag[cnt] = tag[x];
mn[cnt] = mn[x];
add[cnt] = add[x];
child[cnt][] = child[x][];
child[cnt][] = child[x][];
key[cnt] = key[x];
return cnt;
}
int merge(int x, int y)
{
if(!x) return y;
if(!y) return x;
pushdown(x);
pushdown(y);
if(rnd[x] < rnd[y])
{
child[x][] = merge(child[x][], y);
update(x);
return x;
}
else
{
child[y][] = merge(x, child[y][]);
update(y);
return y;
}
}
PII split(int x, int k)
{
if(!x) return make_pair(, );
PII ret;
pushdown(x);
if(k <= size[child[x][]])
{
ret = split(child[x][], k);
child[x][] = ret.second;
ret.second = x;
update(x);
return ret;
}
else
{
ret = split(child[x][], k - size[child[x][]] - );
child[x][] = ret.first;
ret.first = x;
update(x);
return ret;
}
}
void Add(int l, int r, int d)
{
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
key[t2.first] += d;
add[t2.first] += d;
mn[t2.first] += d;
root = merge(t1.first, merge(t2.first, t2.second));
}
void reverse(int l, int r)
{
int mid = r - l + ;
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
tag[t2.first] ^= ;
root = merge(t1.first, merge(t2.first, t2.second));
}
void revolve(int l, int r, int t)
{
if(t < ) t = ;
t %= (r - l + );
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
PII t3 = split(t2.first, r - l + - t);
root = merge(t1.first, merge(merge(t3.second, t3.first), t2.second));
}
void ins(int x, int p)
{
PII t1 = split(root, x);
int a = newnode(p);
root = merge(t1.first, merge(a, t1.second));
}
void del(int x)
{
PII t1 = split(root, x - );
PII t2 = split(t1.second, );
root = merge(t1.first, t2.second);
}
void que(int l, int r)
{
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
printf("%lld\n", mn[t2.first]);
root = merge(t1.first, merge(t2.first, t2.second));
}
void build(int &x, int l, int r)
{
if(l > r) return;
int mid = (l + r) >> ;
x = newnode(a[mid]);
build(child[x][], l, mid - );
build(child[x][], mid + , r);
update(x);
}
void print(int x)
{
if(!x) return;
pushdown(x);
print(child[x][]);
printf("%d ", key[x]);
print(child[x][]);
}
int main()
{
// freopen("supermemo8.in", "r", stdin);
// freopen("output.txt", "w", stdout);
srand();
scanf("%d", &n);
for(int i = ; i <= n; ++i)
scanf("%d", &a[i]);
mn[] = 10000000000000ll;
build(root, , n);
scanf("%d", &m);
while(m--)
{
char opt[]; int l, r, d, x, t, p; scanf("%s", opt);
if(opt[] == 'A')
{
scanf("%d%d%d", &l, &r, &d);
Add(l, r, d);
}
if(opt[] == 'V' && opt[] == 'E')
{
scanf("%d%d", &l, &r);
reverse(l, r);
}
if(opt[] == 'O')
{
scanf("%d%d%d", &l, &r, &t);
revolve(l, r, t);
}
if(opt[] == 'I')
{
scanf("%d%d", &x, &p);
ins(x, p);
}
if(opt[] == 'D')
{
scanf("%d", &x);
del(x);
}
if(opt[] == 'M')
{
scanf("%d%d", &l, &r);
que(l, r);
}
// print(root);
// puts("");
}
// fclose(stdin); fclose(stdout);
return ;
}

bzoj1895的更多相关文章

  1. 【BZOJ1895】Pku3580 supermemo Splay

    [BZOJ1895]Pku3580 supermemo Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg ...

  2. [bzoj1895][Pku3580]supermemo_非旋转Treap

    supermemo bzoj-1895 Pku-3580 题目大意:给定一个n个数的序列,需支持:区间加,区间翻转,区间平移,单点插入,单点删除,查询区间最小值. 注释:$1\le n\le 6.1\ ...

  3. BZOJ1895: Pku3580 supermemo

    1895: Pku3580 supermemo Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 77  Solved: 47[Submit][Status ...

  4. 非旋treap (BZOJ1895)

    记个板子,还是挺好用的. #include <bits/stdc++.h> using namespace std; ]; int rt,n,m,l,r,x,A,B,C,t; struct ...

随机推荐

  1. [Windows Server 2003] 还原SQL Server数据库

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...

  2. C# 打开模态对话框 和打开文件夹

    C# 打开另一个窗体,(模态对话框) Form1 frm= new Form1(); //创建对象 DialogResult retServer = frm.ShowDialog(); //模式对话框 ...

  3. CDR服装设计-用CorelDRAW排钻如何把圈摆均匀

    服装设计一直都是一个很火热的行业,也是一个比较高端的行业,随着时代的步伐,以前的人都是用手绘的方式来设计服装,现在不一样了,电脑可以说普及到了每一个家庭,让软件以更快的速度,更准确的数据来设计服装中的 ...

  4. Altium Designer 2017 ActiveRoute使用以及其他技巧

    ActiveRoute 点击右下角PCB->PCB ActiveRoute调出ActiveRoute面板 在设计电路时,有一堆细小的白色线,表示几个脚之间需要连接,按住键盘Alt + 鼠标左键, ...

  5. 输出n*n矩阵

    int matrix[MAX][MAX]; void PrintMatrix(int x,int y,int start,int n) { ) return ; ) { matrix[x][y] = ...

  6. NFA到DFA实例

    下面图使用NFA表示的状态转换图, 使用子集构造法,有如下过程, ε-closure(0) = {0, 1, 2, 3, 4, 6, 7}初始值,令为AA = {0, 1, 2, 3, 4, 6, 7 ...

  7. hdu2000 ASCII码排序【C++】

    ASCII码排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. Spring Boot学习总结(4)——使用Springloaded进行热部署

    我在开发的时候,总是会及时对自己的程序进行测试,总是频繁的重启web server,容器不烦我们都觉得烦了. dependencys目录下增加: <dependency> <grou ...

  9. Android一键换肤功能:一种简单的实现

     Android一键换肤功能:一种简单的实现 现在的APP开发,通常会提供APP的换肤功能,网上流传的换肤代码和实现手段过于复杂,这里有一个开源实现,我找了一大堆,发现这个项目相对较为简洁:htt ...

  10. iOS学习笔记18-CoreData你懂的

    一.CoreData介绍 CoreData是iOS5之后新出来的的一个框架, 是对SQLite进行一层封装升级后的一种数据持久化方式. 它提供了对象<-->关系映射的功能,即能够将OC对象 ...