首页 > 代码库 > splay poj 3580
splay poj 3580
//16:38#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define INF 0x7FFFFFFF#define maxn 1111111using namespace std;int n,que,ll,rr,v,T,id,root,tot,a[maxn],fa[maxn],size[maxn],key[maxn],minv[maxn],del[maxn],rev[maxn],ch[maxn][2];char opt[11];void init(){ size[0]=fa[0]=0; minv[0]=INF;}void update(int x){ size[x]=size[ch[x][0]]+size[ch[x][1]]+1; minv[x]=key[x]; if (ch[x][0]) minv[x]=min(minv[ch[x][0]],minv[x]); if (ch[x][1]) minv[x]=min(minv[ch[x][1]],minv[x]); }void pushdown(int x){ if (del[x]) { if (ch[x][0]) { del[ch[x][0]]+=del[x]; minv[ch[x][0]]+=del[x]; key[ch[x][0]]+=del[x]; } if (ch[x][1]) { del[ch[x][1]]+=del[x]; minv[ch[x][1]]+=del[x]; key[ch[x][1]]+=del[x]; } del[x]=0; } if (rev[x]) { if (ch[x][0]) rev[ch[x][0]]^=1; if (ch[x][1]) rev[ch[x][1]]^=1; swap(ch[x][0],ch[x][1]); rev[x]=0; }}void rotate(int x,int opt) //RR 0 LR 1{ int y=fa[x]; pushdown(y); pushdown(x); ch[y][opt]=ch[x][opt^1]; if (ch[x][opt^1]) fa[ch[x][opt^1]]=y; fa[x]=fa[y]; if (fa[y]) ch[fa[y]][y==ch[fa[y]][1]]=x; fa[y]=x; ch[x][opt^1]=y; update(y); update(x);}void splay(int x,int y){ while (fa[x]!=y) { if (fa[fa[x]]==y) rotate(x,x==ch[fa[x]][1]); else { if (fa[x]==ch[fa[fa[x]]][0]) { if (x==ch[fa[x]][0]) { rotate(fa[x],0); rotate(x,0); } else { rotate(x,1); rotate(x,0); } } else { if (x==ch[fa[x]][1]) { rotate(fa[x],1); rotate(x,1); } else { rotate(x,0); rotate(x,1); } } } } if (!y) root=x;}int getpos(int x,int rem){ pushdown(x); if (size[ch[x][0]]>=rem) return getpos(ch[x][0],rem); if (size[ch[x][0]]+1==rem) return x; return getpos(ch[x][1],rem-size[ch[x][0]]-1);}void add(int ll,int rr,int d){ int x=getpos(root,ll),y=getpos(root,rr+2); splay(x,0); splay(y,x); del[ch[y][0]]+=d; minv[ch[y][0]]+=d; key[ch[y][0]]+=d; update(y); update(x); }void reverse(int ll,int rr){ int x=getpos(root,ll),y=getpos(root,rr+2); splay(x,0); splay(y,x); rev[ch[y][0]]^=1; }void revolve(int ll,int rr,int T){ T%=(rr-ll+1); if (!T) return; T=rr-T; reverse(ll,T); reverse(T+1,rr); reverse(ll,rr);}void insert(int id,int v){ int x=getpos(root,id+1),y=getpos(root,id+2); splay(x,0); splay(y,x); key[++tot]=v; minv[tot]=v; size[tot]=1; fa[tot]=y; ch[y][0]=tot; update(y); update(x); splay(tot,0);}void remove(int id){ int x=getpos(root,id),y=getpos(root,id+2); splay(x,0); splay(y,x); ch[y][0]=0; update(y); update(x);}int query(int ll,int rr){ int x=getpos(root,ll),y=getpos(root,rr+2); splay(x,0); splay(y,x); return minv[ch[y][0]]; }void addnode(int now,int &x,int fr){ key[++tot]=a[now]; minv[tot]=key[tot]; size[tot]=1; fa[tot]=fr; x=tot;}void build(int ll,int rr,int &x,int fr){ if (ll>rr) return; int mid=(ll+rr)/2; addnode(mid,x,fr); build(ll,mid-1,ch[x][0],x); build(mid+1,rr,ch[x][1],x); update(x);}int main(){ init(); scanf("%d",&n); tot=2; root=1; ch[1][1]=2; fa[2]=1; size[1]=2; size[2]=1; minv[1]=minv[2]=INF; for (int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,ch[2][0],2); update(2); update(1); scanf("%d",&que); for (int i=1;i<=que;i++) { scanf("%s",opt); switch (opt[0]) { case ‘A‘: scanf("%d %d %d",&ll,&rr,&v); add(ll,rr,v); break; case ‘R‘: if (opt[3]==‘E‘) { scanf("%d %d",&ll,&rr); reverse(ll,rr); } else { scanf("%d %d %d",&ll,&rr,&T); revolve(ll,rr,T); } break; case ‘I‘: scanf("%d %d",&id,&v); insert(id,v); break; case ‘D‘: scanf("%d",&id); remove(id); break; case ‘M‘: scanf("%d %d",&ll,&rr); printf("%d\n",query(ll,rr)); break; } } return 0;}
splay poj 3580
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。