裸的主席树,没什么好说的

 type node=record
       l,r,s:longint;
     end;
var tree:array[..] of node;
    sa,rank,a,b,sum,head:array[..] of longint;
    t,k,x,y,i,n,m,p:longint; procedure swap(var a,b:longint);
  var c:longint;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure sort(l,r: longint);
  var i,j,x:longint;
  begin
    i:=l;
    j:=r;
    x:=a[(l+r) shr ];
    repeat
      while a[i]<x do inc(i);
      while x<a[j] do dec(j);
      if not(i>j) then
      begin
        swap(a[i],a[j]);
        swap(b[i],b[j]);
        inc(i);
        j:=j-;
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end; procedure update(x:longint);
  begin
    tree[x].s:=tree[tree[x].l].s+tree[tree[x].r].s;
  end; function build(l,r:longint):longint;
  var m,q:longint;
  begin
    inc(t);
    q:=t;
    if l=r then exit(t)
    else begin
      m:=(l+r) shr ;
      tree[q].l:=build(l,m);
      tree[q].r:=build(m+,r);
    end;
    exit(q);
  end; function pre(w,l,r:longint):longint;
  var m,q:longint;
  begin
    inc(t);
    q:=t;
    if l=r then
      tree[q].s:=sum[l]
    else begin
      m:=(l+r) shr ;
      if rank[i]<=m then
      begin
        tree[q].l:=pre(tree[w].l,l,m);
        tree[q].r:=tree[w].r;
      end
      else begin
        tree[q].l:=tree[w].l;
        tree[q].r:=pre(tree[w].r,m+,r);
      end;
      update(q);
    end;
    exit(q);
  end; function ask(x,y,l,r:longint):longint;
  var m,a,b:longint;
  begin
    if l=r then
      exit(sa[l])
    else begin
      m:=(l+r) shr ;
      a:=tree[x].l;
      b:=tree[y].l;
  //    writeln(l,' ',m,' ',tree[b].s-tree[a].s);
      if tree[b].s-tree[a].s>=k then
        exit(ask(a,b,l,m))
      else begin
        k:=k-(tree[b].s-tree[a].s);
        exit(ask(tree[x].r,tree[y].r,m+,r));
      end;
    end;
  end; begin
  readln(n,m);
  for i:= to n do
  begin
    read(a[i]);
    b[i]:=i;
  end;
  sort(,n);
  p:=;
  rank[b[]]:=;
  sa[]:=a[];
  for i:= to n do
  begin
    if a[i]<>a[i-] then
    begin
      inc(p);
      sa[p]:=a[i];
    end;
    rank[b[i]]:=p;
  end;
  t:=;
  head[]:=build(,p);
  for i:= to n do
  begin
    inc(sum[rank[i]]);
    head[i]:=pre(head[i-],,p);
  end;
  for i:= to m do
  begin
    readln(x,y,k);
    writeln(ask(head[x-],head[y],,p));
  end;
end.

poj2104的更多相关文章

  1. 【POJ2104】K-th Number

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3

  2. 主席树模板(poj2104)

    主席树是可持久化线段树,可以记录线段树的历史版本. 代码中和线段树不同的是,l,r记录的是左右子树编号,因为普通的线段树版本中,左右子树自然就是o<<1和o<<1|1,但是主席 ...

  3. POJ2104 区间第k小

    题意就是区间第k大…… 题解: 前段时间用主席树搞掉了…… 如今看到划分树,是在想来写一遍,结果18号对着学长的代码调了一上午连样例都没过,好桑心…… 今天在做NOI2010超级钢琴,忽然发现用划分树 ...

  4. 【POJ2104】【HDU2665】K-th Number 主席树

    [POJ2104][HDU2665]K-th Number Description You are working for Macrohard company in data structures d ...

  5. poj2104(划分树模板)

    poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...

  6. 划分树(poj2104)

    poj2104 题意:给出n个数,有m次查询,每次查询要你找出 l 到 r 中第 k 大的数: 思路:划分树模板题 上述图片展现了查询时如何往下递推的过程 其中ly表示 [sl,l) 中有多少个数进入 ...

  7. POJ2104 K-th Number [整体二分]

    题目传送门 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 69053   Accepted: 24 ...

  8. 【莫队算法】【权值分块】poj2104 K-th Number / poj2761 Feed the dogs

    先用莫队算法保证在询问之间转移的复杂度,每次转移都需要进行O(sqrt(m))次插入和删除,权值分块的插入/删除是O(1)的. 然后询问的时候用权值分块查询区间k小值,每次是O(sqrt(n))的. ...

  9. poj2104(划分树模板)

    poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...

  10. POJ2104 K-th Number —— 区间第k小 整体二分

    题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Tota ...

随机推荐

  1. ios fixed属性bug解决方法

    在内容层外面包一个div 加上样式:position:fixed;top:0px; bottom:50px;overflow:scroll; 就可以完美解决

  2. MFC类的结构

    1. CObject类,MFC库中绝大部分类的基类,封装了MFC中的最基本机制. 运行时类信息机制/动态创建机制/序列化机制等... 2. CCmdtarget - 消息映射机制最基类 3. CWin ...

  3. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  4. NPOI_2.1.3-Excel中设置小数、百分比、货币、日期、科学计数法和金额大写

    在操作Excel时候一些特殊值的转换是在所难免的,下面就给出转换方法大同小异,代码如下: HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); ISheet ...

  5. a标签使用

    1.发起邮件 注意:如果mailto后面同时有多个参数的话,第一个参数必须以“?”开头,后面的参数每一个都以“&”分隔. <a href="mailto:281345774@q ...

  6. 关于Hyper-V虚拟机中的vEthernet虚拟网卡不能联网的问题

    Hyper-V虚拟机在我电脑里面已经有一年了,当初是因为windows8系统里面需要装Hyper-V,这样才能不让win8死机,就折腾了一整子,结果碰到vEthernet网卡不能联网,网上相关的资料少 ...

  7. 系统重装后phpnow修复

    最近在捣鼓wordpress,主题写了一半然后就重装了win8,在新系统里面访问127.0.0.1的时候出现无法访问的情况.主题写了一半,又不想重装wordpress导数据库这些繁琐的过程,于是,尝试 ...

  8. js 中对象属性特性2

    对象的存储描述: get   和   set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...

  9. css3实现垂直居中,水平

    .box{ text-align:center; } .content{ margin-top:50%; transform:translateY(-50%);/**沿Y轴移动**/ } <di ...

  10. HDU1004 (数组元素出现最多)

    HDU1004 思路:求数组中出现次数最多的那个元素: 遍历数组元素,找出每个元素出现的次数 Input Input contains multiple test cases. Each test c ...