Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
Yuta have a sequence. Because the sequence is very self-willed(RenXing), at first the sequence is empty. And then Yuta do n operations on this sequence, each operation is either of these two types:
1.Add a number w into each gap of the sequence. For example if w=3 and the sequence before is “2 4”, it will be changed to “3 2 3 4 3”.
**after the first operation of the first type, there is only one number in the sequence**
2.Query the kth small number in the subsequence [L,R]. For example if k=2, L=2, R=4 and the sequence is “3 2 3 4 2”, the answer will be 3.
Yuta wants Rikka to tell him the answer of each query.
It is too difficult for Rikka. Can you help her?
Input
n(n≤100000). Each of the following
n lines describes an operation: if it is “1 w” it will be the first type. Otherwise if it is “2 L R k”, it will be the second type.
(1≤w≤109,L≤R≤1018)
R will not be larger than the length of the sequence
Output
For each query operation, output one number – the answer.
Sample Input
6
1 3
1 1
2 2 3 2
1 2
2 3 5 2
2 1 4 4
Sample Output
3
2
3
因為每次加進來的數一定占據了目前的奇數位置,是以暴力的統計區間範圍内的數字個數即可。
#include <cstdio>
#include <algorithm>
const int maxn = 200009;
using namespace std;
int n, a[maxn], m, tot;
long long L, R, l, r, K;
struct node
{
int w;
long long cnt;
node(int w = 0, long long cnt = 0) :w(w), cnt(cnt){}
bool operator<(const node &rhs)const{ return w < rhs.w; }
}p[maxn];
inline void solve()
{
scanf("%I64d%I64d%I64d", &L, &R, &K);
int time = 0;
for (int t = tot - 1; L <= R; L = (L + 1) >>1, R = R >> 1, t--)
{
l = L; if (!(l & 1))l++;
r = R; if (!(r & 1))r--;
if (l <= r) p[time++] = node(a[t], (r - l) / 2 + 1);
}
sort(p, p + time);
for (int i = 0; K&&i < tot; i++)
{
K -= min(K, p[i].cnt);
if (!K) printf("%d\n", p[i].w);
}
}
int main()
{
while (scanf("%d", &n) != EOF)
{
tot = 0;
while (n--)
{
scanf("%d", &m);
if (m == 1) scanf("%d", &a[tot++]);
else solve();
}
}
return 0;
}