提交时间:2023-08-16 11:01:10

运行 ID: 98566

#include <bits/stdc++.h> using i64 = int64_t; const int N = 2e5 + 10; const int M = 2e3 + 10; int pos[N], a[N]; int bl[M], br[M], tag[M]; int n, m, block; inline void pushdoen(int x) { if (!tag[x]) return ; for (int i = bl[x]; i <= br[x]; i++) a[i] = tag[x]; tag[x] = 0; } inline void done(int x, const int &c) { if (a[x] != c) a[x] = c; else ans++; } inline int ask(int l, int r, int c) { if (pos[l] == pos[r]) { pushdown(pos[l]); for (int i = l; i <= r; i++) done(i, c); } else { pushdown(pos[l]); for (int i = l; i <= br[pos[l]]; i++) done(i, c); pushdown(pos[r]); for (int i = bl[pos[r]]; i <= r; i++) done(i, c); for (int i = pos[l] + 1; i <= pos[r] - 1; i++) { if (tag[i]) { if (tag[i] != c) tag[i] = c; else ans += br[i] - bl[i] + 1; } else { for (int j = bl[i]; j <= br[i]; j++) done(j, c); tag[i] = c; } } } return ans; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cin >> n >> m; for (int i = 1; i <= n; i++) std::cin >> a[i]; block = sqrt(n); for (int i = 1; i <= n; i++) pos[i] = (i - 1) / block + 1; for (int i = 1; i <= pos[n]; i++) { bl[i] = (i - 1) * block + 1; br[i] = std::min(i * block, n); } for (int i = 1; i <= m; i++) { int l, r, c; std::cin >> l >> r >> c; std::cout << ask(l, r, c) << '\n'; } return 0; }