RT,从去年10月开始学的时候一直断断续续调到现在,依然0分
顺便问一下带修莫队能不能和普通的莫队一样用奇偶优化
#include <bits/stdc++.h>
using namespace std;
inline long long read(){
char ch = getchar() , fl = 1;
while (ch > '9' || ch < '0'){
if (ch == '-')fl = -1;
ch = getchar();
}
long long p = 0;
while (ch >= '0' && ch <= '9'){
p = p * 10 + ch - '0';
ch = getchar();
}
return fl * p;
}
struct ask{int l , r , ll , rr , t , st;}q[1000005];
struct rrr{int st , col;}ri[1000005];
inline bool cmp(ask a , ask b){
if (a.ll == b.ll){
if (a.rr == b.rr)return a.t < b.t;
return a.rr < b.rr;
}
return a.ll < b.ll;
}
int a[1000005] , sum[1000005] , cnt , c1 , c2 , ans[1000005];
inline void add(int s){
if (!sum[s])cnt++;
sum[s]++;
}
inline void del(int s){
sum[s]--;
if (!sum[s])cnt--;
}
inline void change(int s , int l , int r){
if (ri[s].st >= l && ri[s].st <= r){
del(a[ri[s].st]);
add(ri[s].col);
}
swap(ri[s].col , a[ri[s].st]);
}
signed main(){
int n = read() , m = read() , k = pow(n , 2.0 / 3);
for (int i = 1;i <= n;++i)a[i] = read();
for (int i = 1;i <= m;++i){
char c = getchar();
while (c != 'Q' && c != 'R')c = getchar();
if (c == 'Q'){
q[++c1].l = read();
q[c1].r = read();
q[c1].ll = q[c1].l / k;
q[c1].rr = q[c1].r / k;
q[c1].st = c1;
q[c1].t = c2;
}else if (c == 'R'){
ri[++c2].st = read();
ri[c2].col = read();
}
}
sort (q + 1 , q + c1 + 1 , cmp);
int l = 1 , r = 0 , t = 0;
for (int i = 1;i <= c1;++i){
while (r < q[i].r)add(a[++r]);
while (r > q[i].r)del(a[r--]);
while (l < q[i].l)add(a[l++]);
while (l > q[i].l)del(a[--l]);
while (t < q[i].t)change(++t , l , r);
while (t > q[i].t)change(t-- , l , r);
ans[q[i].st] = cnt;
}
for (register int i = 1;i <= c1;++i)printf ("%d\n" , ans[i]);
return 0;
}