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. 【技术累积】【点】【java】【25】Orderd

    基础概念 Orderd是spring core中定义的一个接口,使用它以及相关的Comparator和@Order注解,可以实现对元素的排序. @Order 直接先说下@Order注解吧,使用场景较多 ...

  2. java_servlet执行流程和生命周期

        

  3. ARX自定义实体

    本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...

  4. SGU100

    Read integers A and B from input file and write their sum in output file. Input Input file contains ...

  5. Bomb HDU - 3555

    Bomb HDU - 3555 求1~n中含有49数的个数 #include<bits/stdc++.h> #define LL long long using namespace std ...

  6. 18.match_phrase的用法

    主要知识点: match_phrase的使用场景 match_phrase的用法 match_phrase的原理     一.什么是近似匹配 match_phrase的使用场景 现假设有两个句子   ...

  7. BUAA_OO_博客作业三

    1 JML语言总结 1.1 JML语言的理论基础 ​ JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言(Behavi ...

  8. hdu_1005_Number Sequence_201310222120

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. 从事分布式系统,计算,hadoop

    作者:廖君链接:https://www.zhihu.com/question/19868791/answer/88873783来源:知乎 分布式系统(Distributed System)资料 < ...

  10. 修改 db_unique_name

    在创建DB的时候 db_unique_name设置错了.本来我是想让 db_name=itid db_unique_name=itid1 不过想改回来很简单的. SQL> alter syste ...