#include <bits/stdc++.h>
using namespace std;

const int N= 100005;

struct node{
    int maxPrefix;
    int maxSuffix;
    int ans;
    long left;
    long right;

    void assignLeaf( long val ){
        maxPrefix= maxSuffix= ans= 1;
        left= right= val;
    }

    void merge( node a, node b ){

        this->left= a.left;
        this->right= b.right;
        this->maxPrefix= a.maxPrefix;
        this->maxSuffix= b.maxSuffix;

        if( a.right < b.left ){
            this->ans= max( maxSuffix+maxPrefix, max( maxPrefix, maxSuffix ) );
        }else{
            this->ans= max( a.ans, b.ans );
        }

    }
};

node st[4*N];
long a[N];

void build( int id, int l, int r ){

    if( l== r ){
        st[id].assignLeaf( a[l] );
        return ;
    }

    int mid= l + ( r-l )/2;

    build( 2*id, l, mid );
    build( 2*id+1, mid+1, r );

    st[id].merge( st[id*2], st[id*2+1] );

}

int query( int id, int l, int r, int x, int y ){

    if( l > r || y < l || x > r )
        return 0;

    if( x<= l && y >= r )
        return st[id].ans;

    int mid= l + ( r-l )/2;

    int a= query( 2*id, l, mid, x, y );
    int b= query( 2*id+1, mid+1, r , x, y );

    return max( a, b );
}

void update( int id, int l, int r, int x , long val ){

    if( l== r ){
        a[x]= val;
        st[id].assignLeaf( val );
        return ;
    }

    int mid= l + ( r-l )/2;

    if( mid >= l && x <= mid )
        update( 2*id, l, mid, x, val );
    else
        update( 2*id+1, mid+1, r, x, val );

    st[id].merge( st[id*2], st[id*2+1] );

}

int main(){

    int n, x, y, t, p, q;

    cin >> t;

    while( t-- ){

        cin >> n >> q;

        for( int i= 0; i< n; ++i )
            cin >> a[i];

        build( 1, 0, n-1 );

        while( q-- ){

            cin >> p >> x >> y;

            if( p ){
                update( 1, 0, n-1, x, y );
            }else{
                cout << query( 1, 0, n-1, x, y );
            }

        }



    }

}
