code
#include <iostream>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
#define forn(i, n) for (int i = 0; i < int(n); i++)
using namespace std;
using ll = long long;
inline int read(){
int x = 0, op = 1; char ch = getchar();
while (!isdigit(ch)){ if (ch == '-') op = -1; ch = getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48), ch = getchar();}
return x * op;
}
struct item
{
int mx;
};
struct segtree
{
int size;
vector<item> v;
const item NEUTURAL_ELEMNT = {0};
item merge(item a, item b){
return {max(a.mx, b.mx)};
}
item single(int val){
return {val};
}
void init(int n){
size = 1;
while(size < n) size <<= 1;
v.resize(size << 1);
}
void build(vector<int> &a, int rt, int l, int r){
if (l == r)
{
if (l < a.size()) v[rt] = single(a[l]);
return;
}
int m = (l + r) >> 1;
build(a, rt << 1, l, m);
build(a, rt << 1|1, m + 1, r);
v[rt] = merge(v[rt << 1], v[rt << 1|1]);
}
void build(vector<int> &a){
build(a, 1, 1, size);
}
void set(int rt, int pos, int l, int r, int val){
if (l == r)
{
v[rt] = single(val);
return;
}
int m = (l + r) >> 1;
if (pos <= m)
{
set(rt << 1, pos, l, m, val);
}else{
set(rt << 1|1, pos, m + 1, r, val);
}
v[rt] = merge(v[rt << 1], v[rt << 1|1]);
}
void set(int pos, int val){
set(1, pos, 1, size, val);
}
int calc(int rt, int lb, int l, int r, int val){
if (r < lb)
{
return 0;
}
if (v[rt].mx < val)
{
return 0;
}
if (l == r)
{
return l;
}
int mid = (l + r) >> 1;
int res = calc(rt << 1, lb, l, mid, val);
if (res == 0)
res = calc(rt << 1|1, lb, mid + 1, r, val);
return res;
}
int calc(int val, int lb){
return calc(1, lb, 1, size, val);
}
};
int main(int argc, char const *argv[])
{
int n = read(), m = read();
segtree st;
st.init(n);
std::vector<int> a;
a.resize(n + 1);
for (int i = 1; i <= n; ++i)
{
a[i] = read();
}
st.build(a);
while(m--){
int op = read(), x = read();
if (op == 1)
{
int v = read();
st.set(x + 1, v);
}else{
int lb = read();
printf("%d\n", st.calc(x, lb + 1) - 1);
}
}
return 0;
}