#include <bits/stdc++.h>
using
namespace
std;
int
getMid(
int
s,
int
e) {
return
s + (e - s) / 2; }
void
updateValue(
int
arr[],
int
* st,
int
ss,
int
se,
int
index,
int
value,
int
node)
{
if
(index < ss || index > se) {
cout <<
"Invalid Input"
<< endl;
return
;
}
if
(ss == se) {
arr[index] = value;
st[node] = value;
}
else
{
int
mid = getMid(ss, se);
if
(index >= ss && index <= mid) {
updateValue(arr, st, ss, mid, index, value,
2 * node + 1);
}
else
{
updateValue(arr, st, mid + 1, se, index, value,
2 * node + 2);
}
st[node] = max(st[2 * node + 1], st[2 * node + 2]);
}
return
;
}
int
findMinimumIndex(
int
* st,
int
ss,
int
se,
int
K,
int
si)
{
if
(st[si] < K)
return
1e9;
if
(ss == se) {
if
(st[si] >= K) {
return
ss;
}
return
1e9;
}
int
mid = getMid(ss, se);
int
l = 1e9;
if
(st[2 * si + 1] >= K)
l = min(l, findMinimumIndex(st, ss, mid, K,
2 * si + 1));
if
(l == 1e9 && st[2 * si + 2] >= K)
l = min(l, findMinimumIndex(st, mid + 1, se, K,
2 * si + 2));
return
l;
}
int
Build(
int
arr[],
int
ss,
int
se,
int
* st,
int
si)
{
if
(ss == se) {
st[si] = arr[ss];
return
arr[ss];
}
int
mid = getMid(ss, se);
st[si] = max(Build(arr, ss, mid, st, si * 2 + 1),
Build(arr, mid + 1, se, st, si * 2 + 2));
return
st[si];
}
int
* constructST(
int
arr[],
int
n)
{
int
x = (
int
)(
ceil
(log2(n)));
int
max_size = 2 * (
int
)
pow
(2, x) - 1;
int
* st =
new
int
[max_size];
Build(arr, 0, n - 1, st, 0);
return
st;
}
void
PerformQueries(
int
arr[],
int
N,
vector<vector<
int
> > Q)
{
int
* st = constructST(arr, N);
for
(
int
i = 0; i < Q.size(); i++) {
if
(Q[i][0] == 1)
updateValue(arr, st, 0, N - 1, Q[i][1] - 1, 5,
0);
else
{
int
f = findMinimumIndex(st, 0, N - 1, Q[i][1],
0);
if
(f < N)
cout << f + 1 <<
" "
;
else
cout << -1 <<
" "
;
}
}
}
int
main()
{
int
arr[] = { 1, 3, 2, 4, 6 };
vector<vector<
int
> > Q{
{ 2, 5 }, { 1, 3, 5 }, { 2, 4 }, { 2, 8 }
};
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
PerformQueries(arr, N, Q);
return
0;
}