#include <bits/stdc++.h>
using
namespace
std;
bool
visited[100001];
int
parent[100001];
int
last[100001];
int
Count[100001];
int
findParent(
int
i) {
if
(parent[i] == i) {
return
i;
}
return
parent[i] = findParent(parent[i]);
}
void
Union(
int
u,
int
v,
int
arr[]) {
int
p1=findParent(u);
int
p2=findParent(v);
parent[p2] = p1;
last[p1] = last[p2];
}
void
newUnion(
int
low,
int
high,
int
arr[]) {
for
(
int
i = low + 1; i <= high; i++) {
Union(low, i, arr);
}
if
(low > 0 && visited[low - 1]) {
Union(low - 1, low, arr);
}
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
if
(high < N - 1 && visited[high + 1]) {
Union(high, high + 1,arr);
}
}
int
findJumpLength(
int
low) {
int
p = findParent(low);
int
nextIndex = last[p] + 1;
int
jump = (nextIndex - low);
return
jump;
}
void
processTypeOneQuery(vector<
int
> query,
int
arr[],
int
P)
{
int
low = query[1];
int
high = query[2];
int
left = -1;
int
j = 3;
while
(low <= high) {
if
(visited[low]) {
if
(left != -1) {
Union(low - 1, left, arr);
left = -1;
}
int
jump = findJumpLength(low);
low += jump;
j += jump;
}
else
if
(Count[low] == P) {
if
(left == -1) {
left = low;
}
visited[low] =
true
;
low++;
j++;
}
else
{
if
(left != -1) {
Union(low - 1, left, arr);
left = -1;
}
arr[low] = query[j];
Count[low]++;
low++;
j++;
}
}
if
(left != -1) {
newUnion(left, high, arr);
}
}
void
processQueries(
int
arr[],
int
P, vector<vector<
int
>> Q) {
for
(
int
i = 0; i < Q.size(); i++) {
vector<
int
> query = Q[i];
if
(query[0] == 1) {
processTypeOneQuery(query,arr,P);
}
else
{
int
index = query[1];
cout << arr[index] << endl;
}
}
}
static
vector<vector<
int
>> getQueries()
{
vector<vector<
int
>> Q;
array<
int
, 7> query1 = { 1, 0, 3, 3, 2, 1, 11 };
array<
int
, 2> query2 = { 2, 3 };
array<
int
, 5> query3 = { 1, 2, 3, 5, 7 };
array<
int
, 2> query4 = { 2, 2 };
Q.push_back(vector<
int
>(query1.begin(), query1.end()));
Q.push_back(vector<
int
>(query2.begin(), query2.end()));
Q.push_back(vector<
int
>(query3.begin(), query3.end()));
Q.push_back(vector<
int
>(query4.begin(), query4.end()));
return
Q;
}
int
main() {
int
arr[] = { 3, 10, 4, 2, 8, 7 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
int
P=1;
vector<vector<
int
>> Q;
for
(
int
i = 0; i < N; i++) {
parent[i] = i;
last[i] = i;
}
Q=getQueries();
processQueries(arr, P, Q);
}