//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node
{
int Pre, Suf;
int PreSize, SufSize, SumSize, Size;
int Left, Right;
};
struct Node SegTree[100005];
int c[100005] = {0};
void Built(int k, int L, int R)
{
SegTree[k].Left = L;
SegTree[k].Right = R;
if(SegTree[k].Left == SegTree[k].Right)
{
SegTree[k].Pre = SegTree[k].Suf = c[L];
SegTree[k].PreSize = SegTree[k].SufSize = SegTree[k].SumSize = SegTree[k].Size = 1;
return;
}
int Mid = (SegTree[k].Left + SegTree[k].Right) >> 1;
Built(k<<1, L, Mid);
Built(k<<1 | 1, Mid+1, R);
SegTree[k].Pre = SegTree[k<<1].Pre;
SegTree[k].Suf = SegTree[k<<1 |1 ].Suf;
SegTree[k].PreSize = SegTree[k<<1].PreSize;
if(SegTree[k<<1].PreSize == SegTree[k<<1].SumSize
&& SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].PreSize += SegTree[k<<1 | 1].PreSize;
SegTree[k].SufSize = SegTree[k<<1 | 1].SufSize;
if(SegTree[k<<1 | 1].SufSize == SegTree[k<<1 | 1].SumSize
&& SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].SufSize += SegTree[k<<1].SufSize;
SegTree[k].SumSize = SegTree[k<<1].SumSize + SegTree[k<<1 | 1].SumSize;
SegTree[k].Size = max(SegTree[k<<1].Size, SegTree[k<<1 | 1].Size);
if(SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].Size = max(SegTree[k].Size, SegTree[k<<1].SufSize+SegTree[k<<1 | 1].PreSize);
}
void Updata(int k, int dir, int num)
{
if(SegTree[k].Left == SegTree[k].Right)
{
SegTree[k].Pre = SegTree[k].Suf = num;
// cout << "U" << SegTree[k].Left << " " <<k << endl;
return;
}
int Mid = (SegTree[k].Left+SegTree[k].Right) >> 1;
if(dir <= Mid)
Updata(k<<1, dir, num);
if(dir > Mid)
Updata(k<<1 | 1, dir, num);
SegTree[k].Pre = SegTree[k<<1].Pre;
SegTree[k].Suf = SegTree[k<<1 |1 ].Suf;
SegTree[k].PreSize = SegTree[k<<1].PreSize;
if(SegTree[k<<1].PreSize == SegTree[k<<1].SumSize
&& SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].PreSize += SegTree[k<<1 | 1].PreSize;
SegTree[k].SufSize = SegTree[k<<1 | 1].SufSize;
if(SegTree[k<<1 | 1].SufSize == SegTree[k<<1 | 1].SumSize
&& SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].SufSize += SegTree[k<<1].SufSize;
SegTree[k].SumSize = SegTree[k<<1].SumSize + SegTree[k<<1 | 1].SumSize;
SegTree[k].Size = max(SegTree[k<<1].Size, SegTree[k<<1 | 1].Size);
if(SegTree[k<<1].Suf < SegTree[k<<1 | 1].Pre)
SegTree[k].Size = max(SegTree[k].Size, SegTree[k<<1].SufSize+SegTree[k<<1 | 1].PreSize);
}
struct Node Query(int k, int L, int R)
{
if(L <= SegTree[k].Left && SegTree[k].Right <= R)
return SegTree[k];
int Mid = (SegTree[k].Left+SegTree[k].Right) >> 1;
struct Node ans,Node1,Node2;
char tag1 = 0, tag2 = 0;
if(L <= Mid)
{
Node1 = Query(k<<1, L, R);
tag1 = 1;
}
if(Mid < R)
{
Node2 = Query(k<<1 | 1, L, R);
tag2 = 1;
}
if(tag1 && tag2)
{
ans.Pre = Node1.Pre;
ans.Suf = Node2.Suf;
ans.PreSize = Node1.PreSize;
if(Node1.PreSize == Node1.SumSize
&& Node1.Suf < Node2.Pre)
ans.PreSize += Node2.PreSize;
ans.SufSize = Node2.SufSize;
if(Node2.SufSize == Node2.SumSize
&& Node1.Suf < Node2.Pre)
ans.SufSize += Node1.SufSize;
ans.SumSize = Node1.SumSize + Node2.SumSize;
ans.Size = max(Node1.Size, Node2.Size);
if(Node1.Suf < Node2.Pre)
ans.Size = max(ans.Size, Node1.SufSize+Node2.PreSize);
}else
{
ans = tag1 ? Node1 : Node2;
}
return ans;
}
int main(void)
{
// freopen("G:\\in.txt","r", stdin);
int T = 0;
// cin >> T;
while(scanf("%d", &T) != EOF)
{
int M,N;
while(T--)
{
//cin >> M >> N;
scanf("%d%d", &M, &N);
for(int i = 0; i < M; i++)
{
//cin >> c[i];
scanf("%d", &c[i]);
}
Built(1, 0, M-1);
while(N--)
{
char ch;
int num1, num2;
// cin >> ch >> num1 >> num2;
// cin >> ch;
// scanf("%c%d%d", &ch, &num1, &num2);
if(ch == 'Q')
{
cout << Query(1, num1, num2).Size << endl;
}
if(ch == 'U')
{
Updata(1, num1, num2);
}
}
}
}
return 0;
}