(待修莫队 没过! 抽空在检查)Dynamic len(set(a[L:R])) UVA - 12345

时间:2023-03-09 20:10:04
(待修莫队 没过!  抽空在检查)Dynamic len(set(a[L:R])) UVA - 12345
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
int n, m, pos[maxn], s[], c[maxn], ans, t[maxn];
int qsz, csz;
struct node
{
int l, r, t, id, res;
}Node[maxn]; void add(int l, int r, int t, int id)
{
Node[id].l = l;
Node[id].r = r;
Node[id].t = t;
Node[id].id = id;
}
int l = , r = , T = ;
struct change
{
int pos, Old, New;
}Cha[maxn]; void add_(int pos, int New, int Old, int cnt)
{
Cha[cnt].pos = pos;
Cha[cnt].New = New;
Cha[cnt].Old = Old;
} bool cmp(node a, node b)
{
if(pos[a.l] == pos[b.l])
{
if(pos[a.r] == pos[b.r])
return a.t < b.t;
return pos[a.r] < pos[b.r];
}
return pos[a.l] < pos[b.l];
} bool cmp_id(node a, node b)
{
return a.id < b.id;
} void ad(int val)
{
s[val]++;
if(s[val] == )
ans++;
} void de(int val)
{
s[val]--;
// cout<< ans <<endl;
if(s[val] == )
ans--;
} void go(int idx, int val)
{
if(l <= idx && idx <= r)
{
de(c[idx]);
ad(val);
}
c[idx] = val;
} int main()
{
qsz = csz = ;
ans = ;
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++)
{
scanf("%d", &c[i]);
t[i] = c[i];
}
int block = pow(n, 2.0/);
for(int i=; i<=n; i++)
pos[i] = (i-)/block + ;
for(int i=; i<=m; i++)
{
char str[];
int x, y;
scanf("%s%d%d", str, &x, &y);
if(str[] == 'Q')
{
add(++x, y, csz, ++qsz);
}
else
{
add_(++x, y, t[x], ++csz);
t[x] = y;
}
}
sort(Node+, Node++qsz, cmp);
// for(int i=1; i<=qsz; i++)
// cout<< Node[i].l << " " << Node[i].r << endl;
for(int i=; i<=qsz; i++)
{
for(; T < Node[i].t; T++)
go(Cha[T+].pos, Cha[T+].New);
for(; T > Node[i].t; T--)
go(Cha[T].pos, Cha[T].Old); for(; r < Node[i].r; r++)
ad(c[r+]);
for(; r > Node[i].r; r--)
de(c[r]);
for(; l < Node[i].r; l++)
de(c[l]);
for(; l > Node[i].l; l--)
ad(c[l-]);
// for(; T < Node[i].t; T++)
// go(Cha[T+1].pos, Cha[T+1].New);
// for(; T > Node[i].t; T--)
// go(Cha[T].pos, Cha[T].Old); Node[i].res = ans;
}
sort(Node+, Node+qsz+, cmp_id);
for(int i=; i<=qsz; i++)
printf("%d\n",Node[i].res); return ;
}