主席树(可持久化权值线段树)初探...

  修改一个点只对树上logn个点有影响,所以新建logn个点就行了,总共新建mlogn个点。

  查询一个区间[l,r],相当于将数一个一个加进树,询问第l到第r次操作,这个可以用前缀解决。

  板子不慢。。在第三页,KPM写指针的主席树貌似跑的飞快

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int size,lt,rt;}a[maxn*];
int n,m,x,y,z,sz,ans;
int root[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void build(int &x,int l,int r,int cx)
{
a[++sz]=a[x];a[sz].size++;x=sz;
if(l==r)return;
int mid=(l+r)>>;
if(cx<=mid)build(a[x].lt,l,mid,cx);
else build(a[x].rt,mid+,r,cx);
}
int query(int x,int y,int l,int r,int cx)
{
if(l==r)return l;
int mid=(l+r)>>;
if(a[a[y].lt].size-a[a[x].lt].size>=cx)return query(a[x].lt,a[y].lt,l,mid,cx);
else if(a[a[y].rt].size-a[a[x].rt].size>=cx)return query(a[x].rt,a[y].rt,mid+,r,cx);
else return ;
}
int main()
{
read(n);read(m);
for(int i=;i<=n;i++)
{
read(x);
root[i]=root[i-];
build(root[i],,n,x);
}
for(int i=;i<=m;i++)
{
read(x);read(y);
printf("%d\n",query(root[x-],root[y],,n,((y-x+)>>)+));
}
return ;
}

最新文章

  1. springmvc 上传下载
  2. 自然语言12_Tokenizing Words and Sentences with NLTK
  3. 测试题1 IOS面试基础题
  4. 在Entity Framework 中执行T-sql语句
  5. 使用rsync同步Linux数据到Windows
  6. jquery实现表格行的动态增加和删除
  7. C#winform程序自定义鼠标样式
  8. 关于线程池ThreadPool的学习
  9. BlueTooth的EDR是什么
  10. Microsoft Visual 的变态
  11. 替代PhotoShop:GIMP图形编辑器的使用
  12. 章节九、3-Desired Capabilities介绍
  13. sql中的不常见查询
  14. javase基础回顾(三) 动态代理
  15. TensorFlow的封装
  16. 14.连接池.md
  17. 禁止浏览器backspace键(退格键)时跳转页面(extjs,javascript)
  18. 第二章 mybatis使用注解实现in查询(mysql)
  19. 手机防盗之获取手机经纬度(Android)
  20. 一个简单IOC与DI示例

热门文章

  1. 基于阿里云服务器Linux系统安装配置Redis
  2. 牛客练习赛26:D-xor序列(线性基)
  3. (python)leetcode刷题笔记 01 TWO SUM
  4. Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList
  5. 线性代数之——微分方程和 exp(At)
  6. day-14 回归中的相关系数和决定系数概念及Python实现
  7. leetcode个人题解——#18 4sums
  8. NSTimer使用注意事项
  9. LintCode-71.二叉树的锯齿形层次遍历
  10. HDU 2133 What day is it