Splay 夏大神版

  1 struct Splay{
  2     struct obj{
  3         int s,v,cnt;
  4         obj*f,*c[2];
  5         obj(int _v=0,int _cnt=0,obj*_f=null):
  6             v(_v),cnt(_cnt),f(_f){c[0]=c[1]=null;}
  7         void gets(){
  8             s=size(c[0])+cnt+size(c[1]);
  9         }
 10     }*root;
 11
 12     void rotate(obj*x){
 13         obj*y=x->f;
 14         if(y==null)return;
 15         int d=x==y->c[0];
 16         y->c[!d]=x->c[d];
 17         if(x->c[d])x->c[d]->f=y;
 18         x->f=y->f;
 19         if(y->f)y->f->c[y==y->f->c[1]]=x;
 20         y->f=x,x->c[d]=y;
 21         y->gets(),x->gets();
 22         if(y==root)root=x;
 23     }
 24
 25     void splay(obj*x,obj*f){
 26         while(x->f!=f){
 27             if(x->f->f==f) rotate(x);
 28             else rotate(((x->f->f->v>x->f->v)^(x->f->v>x->v))?x:x->f),rotate(x);
 29         }
 30         x->gets();
 31     }
 32
 33     void insert(int v){
 34         if(root==null){
 35             root=new obj(v,1,null);
 36             return;
 37         }
 38         obj*x=root,*y=null;
 39         while(x&&x->v!=v)y=x,x=x->c[v>x->v];
 40         if(x){
 41             x->cnt++;
 42             splay(x,null);
 43         }else{
 44             x=new obj(v,1,y);
 45             if(y)y->c[v>y->v]=x;
 46             splay(x,null);
 47         }
 48     }
 49
 50     void del(int v){
 51         obj*x=root;
 52         while(x&&x->v!=v)x=x->c[v>x->v];
 53         if(x==null)return;
 54         else if(x->cnt>1){
 55             x->cnt--;
 56             splay(x,null);
 57             return;
 58         }
 59         splay(x,null);
 60         if(x->c[0]){
 61             x=x->c[0];
 62             while(x->c[1])x=x->c[1];
 63             splay(x,root);
 64             x->f=null,x->c[1]=root->c[1];
 65             if(root->c[1])root->c[1]->f=x;
 66             swap(x,root);
 67             delete x;
 68         }else{
 69             x=x->c[1];
 70             if(x)x->f=null;
 71             swap(x,root);
 72             delete x;
 73         }
 74     }
 75
 76     void display(obj*root){
 77         if(!root)return;
 78         display(root->c[0]);
 79         printf("%d ",root->v);
 80         display(root->c[1]);
 81     }
 82
 83     obj*kth(int k){
 84         for(obj*x=root;x;){
 85             if(size(x->c[0])+1==k)return x;
 86             else if(size(x->c[0])>=k)x=x->c[0];
 87             else k-=size(x->c[0])+1,x=x->c[1];
 88         }
 89     }
 90
 91     void clean(obj*x){
 92         if(x==null)return;
 93         clean(x->c[0]),clean(x->c[1]);
 94         delete x;
 95     }
 96
 97     int next(int v){
 98         int ans=INF;
 99         for(obj*x=root;x;){
100             if(x->v>v)ans=min(ans,x->v),x=x->c[0];
101             else x=x->c[1];
102         }
103         return ans;
104     }
105
106     int prev(int v){
107         int ans=-INF;
108         for(obj*x=root;x;){
109             if(x->v<v)ans=max(ans,x->v),x=x->c[1];
110             else x=x->c[0];
111         }
112         return ans;
113     }
114
115     int knum(int v){
116         obj*x=root;
117         while(x&&x->v!=v)x=x->c[v>x->v];
118         if(x)return x->cnt;
119         else return 0;
120     }
121
122     int rank(int v){
123         obj*x=root;
124         int ans=0;
125         while(x&&x->v!=v){
126             if(x->v<v) ans+=size(x->c[0])+x->cnt,x=x->c[1];
127             else x=x->c[0];
128         }
129         return ans+(x?size(x->c[0]):0);
130     }
131
132     void init(){clean(root);root=null;}
133     Splay(){root=null;}
134     ~Splay(){clean(root);root=null;}
135 };
136
137 int l[maxn],r[maxn],ls[maxn],rs[maxn],mid[maxn],lotree;
138 Splay data[maxn];
139 int build(int _l, int _r){
140     int root=lotree++;
141     l[root]=_l,r[root]=_r,mid[root]=(_l+_r)/2,data[root].init();
142     if(_l!=_r)ls[root]=build(_l,mid[root]),rs[root]=build(mid[root]+1,_r);
143     else ls[root]=-1,rs[root]=-1;
144     return root;
145 }
146
147 int arr[maxn];
148 void add(int root,int pos, int _data){
149     if(root==-1)return;
150     data[root].insert(_data);
151     if (pos<=mid[root])add(ls[root],pos,_data);
152     else add(rs[root],pos,_data);
153 }
154
155 void modify(int root,int pos,int _data){
156     if(root==-1)return;
157     data[root].del(arr[pos]);
158     data[root].insert(_data);
159     if (pos<=mid[root])modify(ls[root],pos,_data);
160     else modify(rs[root],pos,_data);
161 }
162
163 int next(int root, int _l, int _r, int v){
164     _l=max(_l,l[root]),_r=min(_r,r[root]);
165     if(_l>_r)return INF;
166     if(_l==l[root]&&_r==r[root])return data[root].next(v);
167     else return min(next(ls[root],_l,_r,v),next(rs[root],_l,_r,v));
168 }
169
170 int prev(int root, int _l, int _r, int v){
171     _l=max(_l,l[root]),_r=min(_r,r[root]);
172     if(_l>_r)return -INF;
173     if(_l==l[root]&&_r==r[root])return data[root].prev(v);
174     else return max(prev(ls[root],_l,_r,v),prev(rs[root],_l,_r,v));
175 }
176
177 int rank(int root,int _l,int _r,int k){
178     _l=max(_l,l[root]),_r=min(_r,r[root]);
179     if(_l>_r)return 0;
180     if(_l==l[root]&&_r==r[root])return data[root].rank(k);
181     else return rank(ls[root],_l,_r,k)+rank(rs[root],_l,_r,k);
182 }
183
184 int knum(int root,int _l,int _r,int k){
185     _l=max(_l,l[root]),_r=min(_r,r[root]);
186     if(_l>_r)return 0;
187     if(_l==l[root]&&_r==r[root])return data[root].knum(k);
188     else return knum(ls[root],_l,_r,k)+knum(rs[root],_l,_r,k);
189 }
190
191 int kth(int root,int _l,int _r,int k){
192     int head=0,tail=100000001;
193     while(tail-head>1){
194         int mid=(head+tail)/2;
195         if (rank(root, _l,_r,mid)<k)head=mid;
196         else tail=mid;
197     }
198     return head;
199 }
200
201 int main()
202 {
203     //FF;
204     int n,m;
205     while(~scanf("%d%d",&n,&m)){
206         lotree=0;
207         int root=build(1,n);
208         for(int i=1;i<=n;i++)scanf("%d",arr+i),add(root,i,arr[i]);
209         while(m--){
210             int o,t1,t2,t3;
211             scanf("%d",&o);
212             switch(o){
213             case 1:
214                 scanf("%d%d%d",&t1,&t2,&t3);
215                 printf("%d\n",rank(root,t1,t2,t3)+1);
216                 break;
217             case 2:
218                 scanf("%d%d%d",&t1,&t2,&t3);
219                 printf("%d\n",kth(root,t1,t2,t3));
220                 break;
221             case 3:
222                 scanf("%d%d",&t1,&t2);
223                 modify(root,t1,t2);
224                 arr[t1]=t2;
225                 break;
226             case 4:
227                 scanf("%d%d%d",&t1,&t2,&t3);
228                 printf("%d\n",prev(root,t1,t2,t3));
229                 break;
230             case 5:
231                 scanf("%d%d%d",&t1,&t2,&t3);
232                 printf("%d\n",next(root,t1,t2,t3));
233                 break;
234             }
235         }
236     }
237 }
时间: 2024-10-13 00:50:54

Splay 夏大神版的相关文章

对战游戏自己简单版+大神版

自己简单版: namespace ConsoleApplication25 { class Program { struct player { public string name; public int hp,atk,def; public wugong wg; } struct wugong { public string name; public int gongji; } static void Main(string[] args) { Console.Write("请输入玩家P1名字

员工信息增删改查程序 (大神版)

#_*_coding:utf-8_*_#第一部分:sql解析import osdef sql_parse(sql): ''' sql_parse--->insert_parse,delete_parse,update_parse,select_parse sql解析总控 :param sql:用户输入的字符串 :return: 返回字典格式sql解析结果 ''''' parse_func={ 'insert':insert_parse, 'delete':delete_parse, 'updat

699的高性价比,大神F1极速版体验一览

提起千元机,大多人的印象就是粗糙.配置低下.系统卡顿以及各种流氓应用,其中因为配置低下导致的使用体验不佳等状况,正是大多低端机并未认真重视的关键问题.因此面对这种情况,一些厂商开始革新产品配置,力求给用户更好的体验. 大神F1极速版是其中率先作出表率的代表. 笔者有幸于近日拿到一台大神F1极速版真机并对其进行了简单体验,在体验过程中,发现这款手机的一些硬件表现.UI体验以及整体使用感受都均为出色,是目前市场上较为主流的高性价比手机. 1.硬件配置:超越价格的良心利器 这款由大神品牌倾力打造的智能

大神F2全网通版/大神X7于26日再次开售

热门手机大神X7和大神F2全网通在2015年1月正式上市之后,且取得了不错的市场表现,也受到了不少消费者的欢迎.在2015年春节过后,大神F2全网通和大神X7将于2月26日在各大网上商城再次开售. 大神X7作为今年年头的旗舰产品,拥有极致的航空级铝合金中框工艺.双玻璃镜面设计和超强配置等众多亮点.大神X7有三个版本上市,分别为全网通高配版本.移动版和双4G版本,除了处理器.内存和网络制式上稍有区别之外,三者的其他配置是相当的.大神X7移动版售价为1599元.移动联通双4G版为1699元,在酷派商

699就买2GB运存,大神F1极速版上手实感

4月3日,刚子拿到大神F1极速版媒体体验机,并没有开始着手进行评测,而是想通过时间来考验下大神f1极速版宣称2GB运存的牛x之处.今天刚好是交还体验机的日子,发完快递就沉下来为大家分享一下我对大神F1极速版的几点认识. 颜值不是关键,握感才是亮点 作为699价位的智能手机,国内其他厂商在外形设计上几乎都没有任何的亮点,均走简约风格.而通过十多天对大神F1极速版的使用,给我最直接的感触就是,虽然颜值不高但握感十足.大神F1极速版外形延续大神一贯设计,相对圆润,但不够窄的边框看着有几分呆板.手机背部

细节值得一提、性能可见一斑------大神F1极速版试用记

近年来,国产手机呈现了迅猛发展的态势,新品不断脱颖而出,而且无论是性能还是外观,都达到了相当高的水准.且不说1500到2000这个价格区间,就是在1000以内,也有很多不错的产品可供大家选择,在这种背景下,高性价比的国产手机无疑成了消费者的明智之选. 以最近上市的大神F1极速版为例,这款产品定价699元,主打平民消费市场.单从价格上看,大神F1极速版瞄准了红米2,不过,无论是外形做工还是内在性能,这款产品都值得一提.在到手之后,小编便迫不及待的试用了一番,接下来,我们不妨来看看大神F1极速版究竟

Android开发相关的Blog推荐——跟随大神的脚步才能成长为大神

本篇文章主要纪录我在学习过程中,发现的非常给力的CSDNBlog和个人Blog,这些Blog都有一个共同的特点,即内容详实,讲解透彻,也算是给后来的初学者指一条路吧!只要你下定决心跟随强者的脚步,成为人们眼中的大神,只不过是时间问题! 下面排名不分先后 CSDN 鸿洋:http://blog.csdn.net/lmj623565791 爱哥:http://blog.csdn.net/aigestudio 老罗:http://blog.csdn.net/luoshengyang 小巫:http:/

大神Note3让千元机更安全

自从大神品牌并入奇酷科技,奇酷手机的频繁曝光让大神失去了往日的光辉.10月22日,放肆前行大神媒体沟通会再次将大神推向微博热议榜,因为大神有足够的用户基数和口碑关注度,所以抛出任何动向均可撼动种种声浪.不知道汪峰会有何感想,毕竟刚刚发布了FIIL耳机,汪峰上头条真难啊. 大神Note3全系适配360 OS 奇酷科技总裁李旺宣布,大神Note3将全面适配360 OS,为用户提供安全.轻快.省电这三大极致体验.在安全体验上,搭载360 OS的大神Note3为用户创建一个独立干净的财产隔离系统,有效避

大神节,大神为什么这么拼?

上周何玺提到,大神手机将大神粉丝节定在"520"是一个比较机智的做法.通过它,大神手机不但巧妙的将自己与年轻人绑在了一起,还可以借此扩大自己的影响力,带来看得见的经济效率. 继上周五@大神手机官方微博曝光将在520大神节期间派发1.04亿元红包券后,@大神手机官方微博周末再次曝光大神节促销内容:三天520元秒杀大神X7,300台大神F2特价抢购等活动. 这个大神节,大神手机为什么这么拼? 一.市场竞争激烈 据市场研究机构IDC公布的2015年第一季度<IDC全球手机季度跟踪报告&