提交时间:2023-08-16 14:33:56

运行 ID: 98786

#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, m; int a[N]; int p, pos[N]; int t, k; struct edge{ int l, r; int x; }f[N]; struct node{ int l, r; int num; int tim; }q[N]; int B; int b[N << 1]; inline bool cmp(node x, node y){ return ((pos[x.l] ^ pos[y.l]) ? pos[x.l] < pos[y.l] : ((pos[x.r] ^ pos[y.r]) ? pos[x.r] < pos[y.r] : x.tim < y.tim)); } inline bool cmp1(node x, node y){ return (pos[x.l] ^ pos[y.l]) ? pos[x.l] < pos[y.l] : (pos[x.l] & 1 ? x.r < y.r : x.r > y.r); } int s[N], S; int cnt[N], num; int ans[N]; inline void add(int x){ num += !cnt[x] ++; } inline void del(int x){ num -= !--cnt[x]; } inline void T(int t, int L, int R){ if(L <= f[t].l && f[t].l <= R){ del(a[f[t].l]); add(f[t].x); } swap(a[f[t].l], f[t].x); } int op[N]; int l[N], r[N], x[N]; bool F, FF; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 1; i <= n; ++ i){ cin >> a[i]; b[++ B] = a[i]; } for(int i = 1; i <= m; ++ i){ cin >> op[i]; if(op[i] == 1){ cin >> l[i] >> r[i] >> x[i]; t ++; f[t].l = l[i]; f[t].r = r[i]; f[t].x = x[i]; b[++ B] = x[i]; if(l[i] != r[i]){ F = 1; } FF = 1; } if(op[i] == 2){ cin >> l[i] >> r[i]; k ++; q[k].l = l[i]; q[k].r = r[i]; q[k].num = k; q[k].tim = t; } } if(!FF){ p = sqrt(n); for(int i = 1; i <= n; ++ i){ pos[i] = (i - 1) / p + 1; } sort(q + 1, q + k + 1, cmp1); sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } int L = 1, R = 0; for(int i = 1; i <= k; ++ i){ while(L > q[i].l) add(a[-- L]); while(R < q[i].r) add(a[++ R]); while(L < q[i].l) del(a[L ++]); while(R > q[i].r) del(a[R --]); ans[q[i].num] = num; } for(int i = 1; i <= k; ++ i){ cout << ans[i] << '\n'; } return 0; } if(!F){ p = pow(n, 2 / 3); for(int i = 1; i <= n; ++ i){ pos[i] = (i - 1) / p + 1; } sort(q + 1, q + k + 1, cmp); sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } for(int i = 1; i <= t; ++ i){ f[i].x = lower_bound(b + 1, b + B + 1, f[i].x) - b; } int L = 1, R = 0, now = 0; for(int i = 1; i <= k; ++ i){ while(L > q[i].l) add(a[-- L]); while(R < q[i].r) add(a[++ R]); while(L < q[i].l) del(a[L ++]); while(R > q[i].r) del(a[R --]); while(now < q[i].tim) T(++ now, L, R); while(now > q[i].tim) T(now --, L, R); ans[q[i].num] = num; } for(int i = 1; i <= k; ++ i){ cout << ans[i] << '\n'; } return 0; } sort(b + 1, b + B + 1); for(int i = 1; i <= n; ++ i){ a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b; } for(int i = 1; i <= m; ++ i){ if(op[i] == 1) x[i] = lower_bound(b + 1, b + B + 1, x[i]) - b; } for(int i = 1; i <= m; ++ i){ if(op[i] == 1){ for(int j = l[i]; j <= r[i]; ++ j){ a[j] = x[i]; } } if(op[i] == 2){ num = 0; for(int j = l[i]; j <= r[i]; ++ j){ if(!cnt[a[j]]){ s[++ num] = a[j]; cnt[a[j]] ++; } } cout << num << '\n'; for(int j = 1; j <= num; ++ j){ cnt[s[j]] = 0; } } } return 0; }