voidadd (int l, int r, ll c) {
if (pos[l] == pos[r]) {
for (int i = l; i <= r; i ++) a[i] += c;
for (int i = st[pos[l]]; i <= ed[pos[l]]; i ++) b[i] = a[i];
sort (b + st[pos[l]], b + ed[pos[l]] +1);
return;
}
int L = pos[l] +1, R = pos[r] -1;
if (L <= R) for (int i = L; i <= R; i ++) lazy[i] += c;
for (int i = l; i <= ed[pos[l]]; i ++) a[i] += c;
for (int i = st[pos[r]]; i <= r; i ++) a[i] += c;
for (int i = st[pos[l]]; i <= ed[pos[l]]; i ++) b[i] = a[i];
for (int i = st[pos[r]]; i <= ed[pos[r]]; i ++) b[i] = a[i];
sort (b + st[pos[l]], b + ed[pos[l]] +1);
sort (b + st[pos[r]], b + ed[pos[r]] +1);
}
intquery (int l, int r, ll c) {
int cnt =0, L = pos[l] +1, R = pos[r] -1;
if (pos[l] == pos[r]) {
for (int i = l; i <= r; i ++) cnt += (a[i] < c - lazy[pos[l]]);
return cnt;
}
if (L <= R) for (int i = L; i <= R; i ++) cnt += lower_bound (b + st[i], b + ed[i] +1, c - lazy[i]) - (b + st[i]);
for (int i = l; i <= ed[pos[l]]; i ++) cnt += (a[i] < c - lazy[pos[l]]);
for (int i = st[pos[r]]; i <= r; i ++) cnt += (a[i] < c - lazy[pos[r]]);
return cnt;
}
ll query (int l, int r, ll c) {
ll ret =-inf, L = pos[l] +1, R = pos[r] -1; // -inf is important
if (pos[l] == pos[r]) {
for (int i = l; i <= r; i ++) if (a[i] + lazy[pos[l]] < c) ret = max (a[i] + lazy[pos[l]], ret);
return ret ==-inf ?-1: ret;
}
if (L <= R) for (int i = L; i <= R; i ++) {
int p = lower_bound (b + st[i], b + ed[i] +1, c - lazy[i]) - b;
if (p == st[i]) continue;
ret = max (ret, b[p -1] + lazy[i]);
}
for (int i = l; i <= ed[pos[l]]; i ++) if (a[i] + lazy[pos[l]] < c) ret = max (a[i] + lazy[pos[l]], ret);
for (int i = st[pos[r]]; i <= r; i ++) if (a[i] + lazy[pos[r]] < c) ret = max (a[i] + lazy[pos[r]], ret);
return ret ==-inf ?-1: ret;
}
voidprework () {
tot = (n + B -1) / B;
for (int i =1; i <= tot; i ++) {
st[i] = ed[i -1] +1; ed[i] = min (n, st[i] + B -1);
for (int j = st[i]; j <= ed[i]; j ++) {
pos[j] = i;
}
}
for (int i =1; i <= tot; i ++) {
for (int j = st[i]; j <= ed[i]; j ++) cnt[i][a[j]] ++;
for (int j =1; j <= l; j ++) cnt[i][j] += cnt[i -1][j];
}
for (int i =1; i <= tot; i ++) {
for (int j = i; j <= tot; j ++) {
num[i][j] = num[i][j -1];
for (int k = st[j]; k <= ed[j]; k ++)
if (cnt[j][a[k]] - cnt[i -1][a[k]] > cnt[j][num[i][j]] - cnt[i -1][num[i][j]] || (cnt[j][a[k]] - cnt[i -1][a[k]] == cnt[j][num[i][j]] - cnt[i -1][num[i][j]] && num[i][j] > a[k]))
num[i][j] = a[k];
}
}
}
int dududu[N];
intqury (int l, int r) {
if (pos[l] == pos[r]) {
int ans =0;
for (int i = l; i <= r; i ++) {
++ dududu[a[i]];
if (dududu[a[i]] > dududu[ans] || dududu[a[i]] == dududu[ans] && a[i] < ans) ans = a[i];
}
for (int i = l; i <= r; i ++) dududu[a[i]] =0;
return ans;
}
int L = pos[l] +1, R = pos[r] -1;
int ans =0;
if (L <= R) {
ans = num[L][R];
dududu[num[L][R]] = cnt[R][num[L][R]] - cnt[L -1][num[L][R]];
for (int i = l; i <= ed[pos[l]]; i ++) dududu[a[i]] = cnt[R][a[i]] - cnt[L -1][a[i]];
for (int i = r; i >= st[pos[r]]; i --) dududu[a[i]] = cnt[R][a[i]] - cnt[L -1][a[i]];
}
for (int i = l; i <= ed[pos[l]]; i ++) {
++ dududu[a[i]];
if (dududu[a[i]] > dududu[ans] || dududu[a[i]] == dududu[ans] && a[i] < ans) ans = a[i];
}
for (int i = r; i >= st[pos[r]]; i --) {
++ dududu[a[i]];
if (dududu[a[i]] > dududu[ans] || dududu[a[i]] == dududu[ans] && a[i] < ans) ans = a[i];
}
for (int i = l; i <= ed[pos[l]]; i ++) dududu[a[i]] =0;
for (int i = r; i >= st[pos[r]]; i --) dududu[a[i]] =0;
dududu[num[L][R]] =0;
return ans;
}
#include<iostream>#define int long long
usingnamespace std;
constint N =2e5+10;
constint B =160;
constint P =1e9+7;
int n, m;
int a[N];
int st[N / B +10], ed[N / B +10], pos[N], cnt;
int sum[N / B +10], pre[B][B], suf[B][B];
inlineintread () {
int f =1, ret =0;
char ch = getchar (); while (ch <'0'|| ch >'9') {
if (ch =='-') f =-f;
ch = getchar ();
}
while (isdigit (ch)) ret = ret *10+ ch -'0', ch = getchar ();
return ret * f;
}
inlinevoidadd (int& x, constint& y) {
x += y;
}
inlineintqq (constint& l, constint& r) {
int ret =0;
for (int i = l; i <= r; i ++) add (ret, a[i]);
return ret;
}
inlineintquery (constint& l, constint& r) {
int ret =0;
if (pos[l] == pos[r]) return qq (l, r);
int L = pos[l] +1, R = pos[r] -1;
for (int i = L; i <= R; i ++) add (ret, sum[i]);
add (ret, qq (l, ed[pos[l]]));
add (ret, qq (st[pos[r]], r));
return ret;
}
signedmain (void) {
n = read (); m = read ();
for (int i =1; i <= n; i ++) a[i] = read ();
cnt = (n + B -1) / B; for (int i =1; i <= cnt; i ++) {
st[i] = ed[i -1] +1; ed[i] = min (n, st[i] + B -1);
for (int j = st[i]; j <= ed[i]; j ++) pos[j] = i, add (sum[i], a[j]);
} int x, y, z, l, r, ans;
while (m --) {
int opt; opt = read ();
if (opt ==1) {
x = read (), y = read (), z = read ();
if (x >= B) for (int i = y; i <= n; i += x) add (a[i], z), add (sum[pos[i]], z);
else {
for (int i = y; i <= x; i ++) add (pre[x][i], z);
for (int i = y; i; i --) add (suf[x][i], z);
}
} else { l = read (), r = read ();
ans = query (l, r);
for (int i =1; i < B; i ++) {
int L = (l -1) / i +1, R = (r -1) / i +1;
if (L == R) add (ans, pre[i][(r -1) % i +1] + P - pre[i][(l -1) % i]);
else add (ans, ((R - L -1) * pre[i][i] + pre[i][(r -1) % i +1] + suf[i][(l -1) % i +1]));
}
printf ("%d\n", ans % P);
}
}
return0;
}
#include<map>#include<array>#include<cmath>#include<vector>#include<iostream>#include<algorithm>usingnamespace std;
constint N =1.5e5;
int n, q, B;
int c[N], tim, now[N], ans[N], res, ii, dudu;
int col[N *10];
vector < array <int, 4>> qry;
vector < pair <int, int>> change;
boolcmp (array <int, 4> x, array <int, 4> y) {
if ((x[0] + B -1) / B != (y[0] + B -1) / B) return (x[0] + B -1) / B < (y[0] + B -1) / B;
if ((x[1] + B -1) / B != (y[1] + B -1) / B) return (x[1] + B -1) / B < (y[1] + B -1) / B;
return x[2] < y[2];
}
voidadd (int u) {
col[u] ++;
if (col[u] ==1) ++ res;
}
voiddel (int u) {
col[u] --;
if (col[u] ==0) -- res;
}
int l =1, r =0, t =0;
voidupd (int t) {
t --;
if (l <= change[t].first && change[t].first <= r) del (c[change[t].first]), add (change[t].second);
swap (c[change[t].first], change[t].second);
}
intmain (void) {
scanf ("%d%d", &n, &q); B = pow (n, 0.67);
for (int i =1; i <= n; i ++) scanf ("%d", c + i);
for (int i =1; i <= q; i ++) {
char typ[5]; int x, y;
scanf ("%s%d%d", typ +1, &x, &y);
if (typ[1] =='R') change.push_back ({x, y});
else qry.push_back ({x, y, (int)change.size (), (int)qry.size () +1});
}
sort (qry.begin (), qry.end (), cmp);
for (auto& [ql, qr, qt, aid] : qry) {
while (l > ql) add (c[-- l]);
while (l < ql) del (c[l ++]);
while (r > qr) del (c[r --]);
while (r < qr) add (c[++ r]);
while (t < qt) upd (++ t);
while (t > qt) upd (t --);
ans[aid] = res;
}
for (int i =1; i <= qry.size (); i ++) printf ("%d\n", ans[i]);
return0;
}
#include<array>#include<cmath>#include<vector>#include<iostream>#include<algorithm>usingnamespace std;
constint N =40010;
constint Q =1e5+10;
int n, m;
vector <int> g[N];
int s[N], t[N], tim, c[N], B;
int fa[N][20], dep[N];
int w[N <<1], ans[Q], col[N], res;
bool used[N];
vector < array <int, 4>> qry;
voiddfs (int u) {
dep[u] = dep[fa[u][0]] +1;
s[u] =++ tim; w[tim] = u;
for (int i =1; i <20; i ++) fa[u][i] = fa[fa[u][i -1]][i -1];
for (autov : g[u]) if (v != fa[u][0]) fa[v][0] = u, dfs (v);
t[u] =++ tim; w[tim] = u;
}
intlca (int u, int v) {
if (dep[u] < dep[v]) swap (u, v);
for (int i =19; ~i; i --) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
if (u == v) return v;
for (int i =19; ~i; i --) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
voidmodify (int u) {
if (used[u]) if (!-- col[c[u]]) -- res;
if (!used[u]) if (++ col[c[u]] ==1) ++ res;
used[u] ^=1;
}
intmain (void) {
scanf ("%d%d", &n, &m); B = sqrt (n); vector <int> tmp;
for (int i =1; i <= n; i ++) scanf ("%d", c + i), tmp.push_back (c[i]); sort (tmp.begin (), tmp.end ()); tmp.erase (unique (tmp.begin (), tmp.end ()), tmp.end ());
for (int i =1; i <= n; i ++) c[i] = lower_bound (tmp.begin (), tmp.end (), c[i]) - tmp.begin () +1;
for (int i =1; i < n; i ++) {
int u, v; scanf ("%d%d", &u, &v);
g[u].push_back (v); g[v].push_back (u);
} dfs (1);
for (int i =1; i <= m; i ++) {
int u, v; scanf ("%d%d", &u, &v);
if (s[u] > s[v]) swap (u, v);
int lc = lca (u, v);
if (lc == u) qry.push_back ({s[u], s[v], i, 0});
else qry.push_back ({t[u], s[v], i, lc});
}
sort (qry.begin (), qry.end (), [&](auto x, auto y) { return (x[0] + B -1) / B != (y[0] + B -1) / B ? (x[0] + B -1) / B < (y[0] + B -1) /B : x[1] < y[1]; });
int l =1, r =0;
for (auto& [ql, qr, i, lca] : qry) {
while (l > ql) modify (w[-- l]);
while (r < qr) modify (w[++ r]);
while (l < ql) modify (w[l ++]);
while (r > qr) modify (w[r --]);
if (lca) modify (lca);
ans[i] = res;
if (lca) modify (lca);
}
for (int i =1; i <= m; i ++) printf ("%d\n", ans[i]);
return0;
}