2019银川区域赛
/*
* @Author: 0iq
* @LastEditTime: 2021-07-16 18:05:03
* @优快云 blog: https://blog.youkuaiyun.com/acm_durante
* @E-mail: 1055323152@qq.com
* @ProbTitle:
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define lowbit(x) ((x) & -(x))
#define lson p << 1, l, mid
#define rson p << 1 | 1, mid + 1, r
#define mem(a, b) memset(a, b, sizeof(a))
const int N = 1e5 + 50;
struct node
{
int cnt[6];
int l, r;
int lazy[6];
int maxx;
} t[N << 3];
int n, m, prime[10] = {0, 2, 3, 5, 7};
char s[20];
void build_tree(int l, int r, int p)
{
memset(t[p].cnt, 0, sizeof(t[p].cnt));
memset(t[p].lazy, 0, sizeof(t[p].lazy));
t[p].l = l, t[p].r = r;
t[p].maxx = 0;
if (l == r)
return;
int mid = l + r >> 1;
build_tree(l, mid, p << 1);
build_tree(mid + 1, r, p << 1 | 1);
}
void push_down(int p)
{
for (int i = 1; i <= 4; i++)
{
if (t[p].lazy[i])
{
t[p << 1].cnt[i] += t[p].lazy[i];
t[p << 1 | 1].cnt[i] += t[p].lazy[i];
t[p << 1 | 1].maxx = max(t[p << 1 | 1].maxx, t[p << 1 | 1].cnt[i]);
t[p << 1].maxx = max(t[p << 1].maxx, t[p << 1].cnt[i]);
t[p << 1].lazy[i] += t[p].lazy[i];
t[p << 1 | 1].lazy[i] += t[p].lazy[i];
t[p].lazy[i] = 0;
}
}
}
void push_up(int p)
{
for (int i = 1; i <= 4; i++)
{
t[p].cnt[i] = max(t[p << 1].cnt[i], t[p << 1 | 1].cnt[i]);
}
t[p].maxx = max(t[p << 1].maxx, t[p << 1 | 1].maxx);
}
void modify(int l, int r, int p, int x)
{
int tmp = x;
if (l <= t[p].l && t[p].r <= r)
{
for (int i = 1; i <= 4; i++)
{
while (tmp % prime[i] == 0)
{
t[p].cnt[i]++;
t[p].lazy[i]++;
tmp /= prime[i];
}
t[p].maxx = max(t[p].cnt[i], t[p].maxx);
}
return;
}
push_down(p);
int mid = t[p].l + t[p].r >> 1;
if (l <= mid)
modify(l, r, p << 1, x);
if (mid < r)
modify(l, r, p << 1 | 1, x);
push_up(p);
}
int ask(int l, int r, int p)
{
if (l <= t[p].l && t[p].r <= r)
return t[p].maxx;
push_down(p);
int mid = t[p].l + t[p].r >> 1;
int res = 0;
if (l <= mid)
res = max(res, ask(l, r, p << 1));
if (mid < r)
res = max(res, ask(l, r, p << 1 | 1));
return res;
}
void solve()
{
build_tree(1, n, 1);
getchar();
while (m--)
{
int l, r, x;
scanf("%s %d %d ", s, &l, &r);
if (strcmp(s, "MULTIPLY") == 0)
{
scanf("%d", &x);
modify(l, r, 1, x);
}
else
{
printf("ANSWER %d\n", ask(l, r, 1));
}
}
}
int main()
{
scanf("%d%d", &n, &m);
solve();
return 0;
}