BZOJ 4408: [Fjoi 2016]神秘数 主席树 + 神题
2024-09-25 14:02:52
Code:
#include<bits/stdc++.h>
#define lson ls[x]
#define mid ((l+r)>>1)
#define rson rs[x]
#define maxn 300003
#define inf 1000000001
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int cnt;
int ls[maxn*20], rs[maxn*20], sumv[maxn*20], root[maxn];
void build(int &x,int l,int r)
{
x=++cnt;
if(l==r)return;
if(mid>=l) build(lson, l,mid);
if(r>mid) build(rson,mid+1,r);
}
int update(int x,int l,int r,int k,int delta)
{
int oo=++cnt;
ls[oo]=ls[x], rs[oo]=rs[x], sumv[oo]=sumv[x]+delta;
if(l==r) return oo;
if(k<=mid) ls[oo]=update(lson,l,mid,k,delta);
else rs[oo]=update(rson,mid+1,r,k,delta);
return oo;
}
int query(int u,int v,int l,int r,int L,int R)
{
if(l>=L&&r<=R) return sumv[v]-sumv[u];
int tmp=0;
if(L<=mid) tmp+=query(ls[u],ls[v],l,mid,L,R);
if(R>mid) tmp+=query(rs[u],rs[v],mid+1,r,L,R);
return tmp;
}
int main()
{
// setIO("input");
int n,q,i,a,l,r;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&a);
root[i]=update(root[i-1],1,inf,a,a);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&l,&r);
int mx=0,pos=0,sum;
while(1)
{
sum=query(root[l-1],root[r],1,inf,mx+1,pos+1);
if(sum<=0) break;
mx=pos+1, pos+=sum;
}
printf("%d\n",pos+1);
}
return 0;
}
最新文章
- #研发解决方案介绍#IdCenter(内部统一认证系统)
- 安装thrift
- Ajax异步刷新地址栏url改变(利用Html5 history.pushState实现)
- SU susort命令学习
- JavaScript 之垃圾回收和内存管理
- 64位系统安装ODBC驱动的方法
- springmvc+json
- 高效率使用google
- 网络直播电视之M3U8解析篇 (下)
- iis 回收工作进程时出错的解决办法
- U3D学习使用笔记(三)
- Hadoop入门进阶步步高(六)-Hadoop1.x与Hadoop2的差别
- http层负载均衡之haproxy
- Struts 框架 之 Hello World
- POJ3155 Hard Life [最大密度子图]
- 将表格添加到Word文档中 ,包括表格样式设置
- [jzoj]1729.blockenemy
- python模块之HTMLParser(原理很大程度上就是对类构造的熟练运用)
- hdu-5465-二维BIT+nim
- 修改XML的节点内容