cf 602 D 二分+树状数组

This is the harder version of the problem. In this version, 1≤n,m≤2⋅1051≤n,m≤2⋅105. You can hack this problem if you locked it. But you can hack the previous problem only if you locked both problems.

You are given a sequence of integers a=[a1,a2,…,an]a=[a1,a2,…,an] of length nn. Its subsequence is obtained by removing zero or more elements from the sequence aa (they do not necessarily go consecutively). For example, for the sequence a=[11,20,11,33,11,20,11]a=[11,20,11,33,11,20,11]:

  • [11,20,11,33,11,20,11][11,20,11,33,11,20,11], [11,20,11,33,11,20][11,20,11,33,11,20], [11,11,11,11][11,11,11,11], [20][20], [33,20][33,20] are subsequences (these are just some of the long list);
  • [40][40], [33,33][33,33], [33,20,20][33,20,20], [20,20,11,11][20,20,11,11] are not subsequences.

Suppose that an additional non-negative integer kk (1≤k≤n1≤k≤n) is given, then the subsequence is called optimal if:

  • it has a length of kk and the sum of its elements is the maximum possible among all subsequences of length kk;
  • and among all subsequences of length kk that satisfy the previous item, it is lexicographically minimal.

Recall that the sequence b=[b1,b2,…,bk]b=[b1,b2,…,bk] is lexicographically smaller than the sequence c=[c1,c2,…,ck]c=[c1,c2,…,ck] if the first element (from the left) in which they differ less in the sequence bb than in cc. Formally: there exists tt (1≤t≤k1≤t≤k) such that b1=c1b1=c1, b2=c2b2=c2, ..., bt−1=ct−1bt−1=ct−1 and at the same time bt<ctbt<ct. For example:

  • [10,20,20][10,20,20] lexicographically less than [10,21,1][10,21,1],
  • [7,99,99][7,99,99] is lexicographically less than [10,21,1][10,21,1],
  • [10,21,0][10,21,0] is lexicographically less than [10,21,1][10,21,1].

You are given a sequence of a=[a1,a2,…,an]a=[a1,a2,…,an] and mm requests, each consisting of two numbers kjkj and posjposj (1≤k≤n1≤k≤n, 1≤posj≤kj1≤posj≤kj). For each query, print the value that is in the index posjposj of the optimal subsequence of the given sequence aa for k=kjk=kj.

For example, if n=4n=4, a=[10,20,30,20]a=[10,20,30,20], kj=2kj=2, then the optimal subsequence is [20,30][20,30] — it is the minimum lexicographically among all subsequences of length 22 with the maximum total sum of items. Thus, the answer to the request kj=2kj=2, posj=1posj=1 is the number 2020, and the answer to the request kj=2kj=2, posj=2posj=2 is the number 3030.

Input

The first line contains an integer nn (1≤n≤2⋅1051≤n≤2⋅105) — the length of the sequence aa.

The second line contains elements of the sequence aa: integer numbers a1,a2,…,ana1,a2,…,an (1≤ai≤1091≤ai≤109).

The third line contains an integer mm (1≤m≤2⋅1051≤m≤2⋅105) — the number of requests.

The following mm lines contain pairs of integers kjkj and posjposj (1≤k≤n1≤k≤n, 1≤posj≤kj1≤posj≤kj) — the requests.

Output

Print mm integers r1,r2,…,rmr1,r2,…,rm (1≤rj≤1091≤rj≤109) one per line: answers to the requests in the order they appear in the input. The value of rjrjshould be equal to the value contained in the position posjposj of the optimal subsequence for k=kjk=kj.

Examples

input

3
10 20 10
6
1 1
2 1
2 2
3 1
3 2
3 3

output

20
10
20
10
20
10

input

7
1 2 1 3 1 2 1
9
2 1
2 2
3 1
3 2
3 3
1 1
7 1
7 7
7 4

output

2
3
2
3
2
3
1
1
3

Note

In the first example, for a=[10,20,10]a=[10,20,10] the optimal subsequences are:

  • for k=1: [20]
  • for k=2: [10,20]
  • for k=3 [10,20,10]

题意:求含k个元素 ‘最优子序列’的第pos的元素值

先对题意理解,离线操作,

把序列从大到小排序(先按值大小 后按位置大小!)(卡了我n久)

把要询问求的最优子序列 按k排序

每次询问都是从上一个询问中插入元素

树状数组存的是每个元素的位置

二分位置 如果前缀和小于pos 那就要记录答案

#include<bits/stdc++.h>
#define sscc ios::sync_with_stdio(false)
#define lowbit(x)  x&(-x)
using namespace std;
const int maxn=2e5+10;
int n;
int a[maxn],sum[maxn],ans[maxn];
void add( int x,int val ){
	while( x<=n ) sum[x]+=val,x+=lowbit(x);
}
int query( int x ){
	int s=0;
	while( x>0 ) s+=sum[x],x-=lowbit(x);
	return s;
}
void solve(){
	cin>>n;
	for( int i=1;i<=n;i++ )	cin>>a[i];
	set<pair<int,int>> S;
	for( int i=1;i<=n;i++ ) S.insert(make_pair(-a[i],i));
	int m;
	scanf("%d",&m);
	vector<pair<pair<int,int>,int> >Q;
	for( int i=0;i<m;i++ )
	{
		int x,y;
		cin>>x>>y;
		Q.push_back( make_pair( make_pair(x,y),i ) );
	}
	sort(Q.begin(),Q.end());
//	for(int i=0;i<Q.size();i++){
//		cout<<Q[i].first.first<<" "<<Q[i].first.second<<" "<<Q[i].second<<endl;
//	}
	int now=0;
	for( int i=0;i<Q.size();i++ )
	{
		while( now<Q[i].first.first )
		{
			now++;
			pair<int,int> tmp=*S.begin();
			add(tmp.second,1);
			S.erase(tmp);
		}
		int pos=Q[i].first.second;
		int l=1,r=n;
		while( l<=r )
		{
			int  mid=(l+r)/2;
			if( query(mid)>=pos )
			{
				r=mid-1;
			}
			else l=mid+1;
		}
		ans[ Q[i].second ]=a[r+1];
	}
	for( int i=0;i<m;i++ ) cout<<ans[i]<<endl;

}
int main()
{
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
}

  

原文地址:https://www.cnblogs.com/lyj1/p/11991930.html

时间: 2024-10-24 07:30:19

cf 602 D 二分+树状数组的相关文章

11525 - Permutation(二分+树状数组)

题目链接:点击打开链接 题意:从1~k的所有排列中找到第n个排列, n由公式给出. 思路:可以发现, 这个公式就是康托展开公式(康托展开百科:点击打开链接). 那么s[i]的意思就是i个数中当前数排在第几. 如此, 可以用二分+树状数组快速求解, 和一道BC题目神似. 细节参见代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<st

Codeforces 374D Inna and Sequence 二分+树状数组

题目链接:点击打开链接 给定n个操作,m长的序列a 下面n个数 if(co>=0)则向字符串添加一个co (开始是空字符串) else 删除字符串中有a的下标的字符 直接在序列上搞,简单模拟 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h&

【bzoj2527】[Poi2011]Meteors 整体二分+树状数组

题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BIU的第i个成员国希望能够收集Pi单位的陨石样本.你的任务是判断对于每个国家,它需要在第几次陨石雨之后,才能收集足够的陨石. 输入 第一行是两个数N,M. 第二行有M个数,第i个数Oi表示第i段轨道上有第Oi个国家的太空站. 第三行有N个数,第i个数Pi表示第i个国家希望收集的陨石数量. 第四行有一个

【51nod】 第K大区间2(二分+树状数组)

[51nod] 第K大区间2(二分+树状数组) 第K大区间2 ﹡    LH (命题人) 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 [3]:2 [4]:4 [1,3]:2 [2,4]:2 第三大是2 Input 第一行两个数n和k(1<=n<=100000,k&l

【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M 接下来M行,每行形如1 a b c或2 a b c Output 输出每个询问的结果 Sample Input 2 5 1 1 2 1 1 1 2 2 2 1 1 2 2 1 1 1 2 1 2 3 Sample Output 1 2 1 HINT

【BZOJ-2527】Meteors 整体二分 + 树状数组

2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Status][Discuss] Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colo

【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. 输入 第一行N,M接下来M行,每行形如1 a b c或2 a b c 输出 输出每个询问的结果 样例输入 2 5 1 1 2 1 1 1 2 2 2 1 1 2 2 1 1 1 2 1 2 3 样例输出 1 2 1 题解 整体二分+树状数组区间修改 当年naive的树套树题解 前两天由于要

Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树

Codeforces Round #470 B. Primal Sport 数学题,对 x2 和 x1 分解质因子即可. #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;

CF#609E|二分+树状数组

队友发了一道cf的题过来,然后..一上午就做了一道题.. CF#609E 题目地址 复习树状数组求逆序数1 复习树状数组求逆序数2 参考博客1 参考博客2 题目大意:每次可以移动相邻的结点,求最小能够出现1~k子序列的交换次数 思路: 最小交换次数,首先想到与逆序数有关,以前做过类似的题,3 2 1,交换成 1 2 3的最小次数,就是求 3 2 1这个序列的逆序数=3 这题稍微有点变化,就是3 2 1 中间可能还存在 其它数字,比如 3 4 5 2 1,要我们求 出现 3 2 1 的最小交换次数