https://www.luogu.org/problemnew/show/P3960

常数超大的treap

 #pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
#define N 6001000
queue<int> q;
int ch[N][],r[N],mem;
ll lx[N],rx[N],sz[N];
int rand1()
{
static int x=;
return x=(48271LL*x+)%;
}
int getnode()
{
int t=q.front();q.pop();r[t]=rand1();
lx[t]=rx[t]=sz[t]=ch[t][]=ch[t][]=;
return t;
}
void delnode(int x) {q.push(x);}
void upd(int x) {sz[x]=sz[ch[x][]]+sz[ch[x][]]+rx[x]-lx[x]+;}
int merge(int a,int b)
{
if(!a||!b) return a+b;
if(r[a]<r[b])
{
ch[a][]=merge(ch[a][],b);upd(a);
return a;
}
else
{
ch[b][]=merge(a,ch[b][]);upd(b);
return b;
}
}
pi split(int a,ll n)
{
if(!a) return mp(,);
ll ls=sz[ch[a][]];pi t;
if(n<=ls)
{
t=split(ch[a][],n);ch[a][]=t.se;
upd(a);t.se=a;
}
else
{
t=split(ch[a][],n-ls-(rx[a]-lx[a]+));ch[a][]=t.fi;
upd(a);t.fi=a;
}
return t;
}
int split_node(int a,ll n)
{
ll ls=sz[ch[a][]];
if(n<=ls) {ch[a][]=split_node(ch[a][],n);return a;}
else if(n<=ls+rx[a]-lx[a]+)
{
n-=ls;
int now=ch[a][],rc=ch[a][],t;ll l=lx[a],r=rx[a];
if(n!=)
{
t=getnode();lx[t]=l;rx[t]=l+n-;upd(t);
now=merge(now,t);
}
t=getnode();lx[t]=rx[t]=l+n-;upd(t);
now=merge(now,t);
if(n!=r-l+)
{
t=getnode();lx[t]=l+n;rx[t]=r;upd(t);
now=merge(now,t);
}
now=merge(now,rc);delnode(a);
return now;
}
else {ch[a][]=split_node(ch[a][],n-(ls+rx[a]-lx[a]+));return a;}
}
int rt[];
ll n,m;int qq;
int main()
{
int i,t;ll x,y,ans;pi p1,p2,p3,p4;
for(i=;i<N;++i) q.push(i);
scanf("%lld%lld%d",&n,&m,&qq);
for(i=;i<=n;i++)
{
t=getnode();lx[t]=ll(i-)*m+;rx[t]=ll(i)*m-;upd(t);
rt[i]=t;
}
for(i=;i<=n;i++)
{
t=getnode();lx[t]=rx[t]=i*m;upd(t);
rt[]=merge(rt[],t);
}
while(qq--)
{
scanf("%lld%lld",&x,&y);
if(y==m)
{
rt[]=split_node(rt[],x);
p1=split(rt[],x-);p2=split(p1.se,);
ans=lx[p2.fi];
rt[]=merge(p1.fi,merge(p2.se,p2.fi));
}
else
{
rt[x]=split_node(rt[x],y);
p1=split(rt[x],y-);p2=split(p1.se,);
ans=lx[p2.fi];
rt[x]=merge(p1.fi,p2.se);
rt[]=split_node(rt[],x);
p3=split(rt[],x-);p4=split(p3.se,);
rt[x]=merge(rt[x],p4.fi);
rt[]=merge(p3.fi,merge(p4.se,p2.fi));
}
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. Call me evilxr
  2. 一些PHP性能的优化
  3. [Gnu]Centos7 解决 gdb 提示 Missing separate debuginfos
  4. iPhone的設置——FaceTime頁面
  5. Swift vs. Objective-C:未来看好 Swift 的十个理由
  6. java笔试题(2)
  7. hdu 2819 Swap
  8. [Twisted] deferred
  9. springmvc的讲解
  10. iOS基础 - 数据库CoreData
  11. KMP详解之二
  12. Ubuntu 9.10+ apache2.2 +Django的配置
  13. webStorm Linux Ubuntu 中文搜狗输入问题
  14. 织梦中data文件夹是存放什么内容的
  15. MyEclipse 10 报错记录
  16. Python Django对接企业微信第三方服务回调验证的一些坑
  17. POJ 3974 Palindrome (算竞进阶习题)
  18. CodeForces 70
  19. Redis学习笔记--Redis数据过期策略详解
  20. 提高SqlServer数据库的安全性,禁用掉sa账户

热门文章

  1. C++的string连接(a = a + b 与 a += b)
  2. 用 querySelectorAll 来查询 DOM 节点
  3. Ural 1635 Mnemonics and Palindromes(DP)
  4. redis02---对于key的操作命令
  5. Hive中的一些点
  6. Mybatis中的大于等于和小于等于
  7. EhCache+Redis实现分布式缓存
  8. Android Platform Version与API Level的对应表
  9. 最大网络流 EK 算法
  10. BZOJ1040:骑士(基环树DP)