rt:
#include <iostream>
#include <string>
using namespace std;
struct Tree
{
long long len, lans, rans, midans;
char lc, rc;
}
tree[2000005];
long long n, q, opt, x, y;
char s[500005];
void pushup(int k)
{
tree[k].lc = tree[k << 1].lc;
tree[k].rc = tree[k << 1 | 1].rc;
tree[k].lans = max(tree[k << 1].lans, tree[k << 1].lans == tree[k << 1].len ? tree[k << 1].len + tree[k << 1 | 1].lans : 0ll);
tree[k].rans = max(tree[k << 1 | 1].rans, tree[k << 1 | 1].rans == tree[k << 1 | 1].len ? tree[k << 1 | 1].len + tree[k << 1].rans : 0ll);
tree[k].midans = max((tree[k << 1].rc == tree[k << 1 | 1].lc ? tree[k << 1].rans + tree[k << 1 | 1].lans), max(max(tree[k].lans, tree[k].rans), max(tree[k << 1].midans, tree[k << 1 | 1].midans)));
}
void pushuplrk(Tree l, Tree r, Tree &k)
{
k.lc = l.lc;
tree[k].rc = tree[r].rc;
tree[k].lans = max(tree[l].lans, tree[l].lans == tree[l].len ? tree[l].len + tree[r].lans : 0ll);
tree[k].rans = max(tree[r].rans, tree[r].rans == tree[r].len ? tree[r].len + tree[l].rans : 0ll);
tree[k].midans = max((tree[l].rc == tree[r].lc ? tree[l].rans + tree[r].lans), max(max(tree[k].lans, tree[k].rans), max(tree[l].midans, tree[r].midans)));
}
void mkt(int l, int r, int k)
{
tree[k].len = r - l + 1;
if (l == r)
{
tree[k].lc = tree[k].rc = s[l];
tree[k].lans = tree[k].rans = tree[k].midans = 1;
return;
}
int mid = (l + r) >> 1;
mkt(l, mid, k << 1);
mkt(mid + 1, r, k << 1 | 1);
pushup(k);
}
void update(int L, int R, char c, int l, int r, int k)
{
if (L <= l && r <= R)
{
tree[k].lc = tree[k].rc = c;
tree[k].lans = tree[k].rans = tree[k].midans = 1;
return;
}
int mid = (l + r) >> 1;
if (L <= mid)
{
update(L, R, c, l, mid, k << 1);
}
if (mid < R)
{
update(L, R, c, mid + 1, r, k << 1 | 1);
}
pushup(k);
}
Tree query(int L, int R, int l, int r, int k)
{
if (L <= l && r <= R)
{
return tree[k];
}
int mid = (l + r) >> 1;
Tree lans, rans, ans;
if (L <= mid && mid < R)
{
lans = query(L, R, l, mid, k << 1);
rans = query(L, R, mid + 1, r, k << 1 | 1);
pushuplrk(lans, rans, ans);
return ans;
}
if (L <= mid)
{
return query(L, R, l, mid, k << 1);
}
if (mid < R)
{
return query(L, R, mid + 1, r, k << 1 | 1);
}
}
int main()
{
cin >> n >> q >> s + 1;
while (q--)
{
cin >> opt >> x >> y;
if (opt == 1)
{
update(x, x, y, 1, n, 1);
}
else
{
cout << query(x, y, 1, n, 1) << "\n";
}
}
return 0;
}
只需看思路即可,代码我自己调(当然要是有人帮忙那更好了OWO)