【可持久化线段树】【模板】可持久化线段树 1(主席树)

题目背景

这是个非常经典的主席树入门题——静态区间第K小

数据已经过加强,请使用主席树。同时请注意常数优化

题目描述

如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。

输入输出格式

输入格式:

第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。

第二行包含N个正整数,表示这个序列各项的数字。

接下来M行每行包含三个整数l,r,k, 表示查询区间[l, r]内的第k小值。

输出格式:

输出包含k行,每行1个正整数,依次表示每一次查询的结果

输入输出样例

输入样例#1:

5 5
25957 6405 15770 26287 26465 
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1

输出样例#1:

6405
15770
26287
25957
26287

说明

数据范围

对于100%的数据满足:1≤N,M≤2*10^5;

对于数列中的所有数ai​,均满足−10^9≤ai≤10^9;

样例数据说明

N=5,数列长度为5,数列从第一项开始依次为[25957,6405,15770,26287,26465][25957, 6405, 15770, 26287, 26465 ][25957,6405,15770,26287,26465]

第一次查询为[2,2][2, 2][2,2]区间内的第一小值,即为6405

第二次查询为[3,4][3, 4][3,4]区间内的第一小值,即为15770

第三次查询为[4,5][4, 5][4,5]区间内的第一小值,即为26287

第四次查询为[1,2][1, 2][1,2]区间内的第二小值,即为25957

第五次查询为[4,4][4, 4][4,4]区间内的第一小值,即为26287

注意空间大小   第一次建树新建n*logn个节点 每次修改新建logn个   一共4*2*n*logn个节点

注意 现在的树和减去的树不要写反

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200000+10;
int n,m,a[N],b[N],rt[N],tot;
struct point{int ls,rs,sum;}t[N<<5];
void build(int &i,int l,int r)
 {i=++tot;
  if(l==r) return;
  int mid=l+r>>1;
  build(t[i].ls,l,mid); build(t[i].rs,mid+1,r);
 }
void update(int &i,int l,int r,int last,int x)
 {i=++tot; t[i]=t[last]; t[i].sum++;
  if(l==r) return;
  
  int mid=l+r>>1;
  if(x<=mid)  update(t[i].ls,l  ,mid,t[last].ls,x);
  else        update(t[i].rs,mid+1,r,t[last].rs,x);
 }
 
int query(int now,int last,int l,int r,int k)
 {if(l==r) return l;
 
  int mid=l+r>>1,cnt=t[t[now].ls].sum-t[t[last].ls].sum;
  
  if(k<=cnt) return query(t[now].ls,t[last].ls,l,mid,k);
  else       return query(t[now].rs,t[last].rs,mid+1,r,k-cnt);
 } 
int main()
{
 int que,l,r,k; scanf("%d%d",&n,&que);	
 for(int i=1;i<=n;i++) {scanf("%d",&a[i]);	b[i]=a[i];}
 	
 sort(b+1,b+n+1); m=unique(b+1,b+n+1)-b-1; //离散化 
 
 build(rt[0],1,m); 	                   //建树 
 for(int i=1;i<=n;i++) 
  {int t=lower_bound(b+1,b+m+1,a[i])-b;
   update(rt[i],1,m,rt[i-1],t);
  }
  	
 while(que--)
  {scanf("%d%d%d",&l,&r,&k);
   int t=query(rt[r],rt[l-1],1,m,k);
   printf("%d\n",b[t]);
  } 	
return 0;
}

 

posted @ 2018-10-02 20:34  YuXiaoze  阅读(133)  评论(0编辑  收藏  举报