luogu P3834 【模板】可持久化线段树 1(主席树)
2024-09-05 00:36:59
题解真的是越写越懒
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
using std::sort;
const int maxn = 200006;
int n,m,sum[maxn<<5];
inline int read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
int a[maxn],cnt,tot,root[maxn],hash[maxn],ls[maxn<<5],rs[maxn<<5];
void desk() {
sort(hash+1,hash+n+1);
cnt=std::unique(hash+1,hash+n+1)-(hash+1);
for(int i=1;i<=n;i++) a[i]=std::lower_bound(hash+1,hash+cnt+1,a[i])-hash;
}
void insert(int l,int r,int &rt,int pre,int w) {
rt=++tot;
sum[rt]=sum[pre]+1;
if(l==r)return;
int mid=l+r>>1;
if(w<=mid) rs[rt]=rs[pre],insert(l,mid,ls[rt],ls[pre],w);
else ls[rt]=ls[pre],insert(mid+1,r,rs[rt],rs[pre],w);
}
int query(int l,int r,int tl,int tr,int k) {
if(l==r)return l;
int mid=l+r>>1,tmp=sum[ls[tr]]-sum[ls[tl]];
if(tmp>=k)return query(l,mid,ls[tl],ls[tr],k);
else return query(mid+1,r,rs[tl],rs[tr],k-tmp);
}
int main() {
n=read(),m=read();
for(int i=1;i<=n;++i) a[i]=read(),hash[i]=a[i];
desk();
for(int i=1;i<=n;++i) insert(1,cnt,root[i],root[i-1],a[i]);
for(int l, r, k;m--;) {
l=read(),r=read(),k=read();
printf("%d\n",hash[query(1,cnt,root[l-1],root[r],k)]);
}
return 0;
}
最新文章
- 20145224&;20145238 《信息安全系统设计基础》 第五次实验
- Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
- poj 1521
- Windows 10:解决开机显示C:\WINDOWS\system32\config\systemprofile\Desktop不可用的方法
- 冲刺阶段 day 6
- Bruce Eckel:编程生涯(转载)
- eclipse、myeclipse,svn插件subclipse 忘记密码的解决方法(win7、win8、xp)
- html-制作导航菜单
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
- oracle连接和执行流程总结
- ArcEngine:栅格分级渲染
- NOTIFYICONDATA结构
- Oracle password expire notices
- yii post delete request more safe
- 使用JAVA进行MD5加密后所遇到的一些问题
- PAT (Advanced Level) 1075. PAT Judge (25)
- 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
- 分析MapReduce执行过程+统计单词数例子
- LindDotNetCore~框架介绍及特色功能(有点springboot的意思)
- windows 获取用户的Sid的方法