对着题解把打的不一样的地方都改了改,可它还是30pts……
以及感觉错的地方都很小,就是一个小误差这种感觉……
de了一天bug,求求求助QWQ
#include <math.h>
#include <stdio.h>
#include <algorithm>
#define N 500010
using namespace std;
int n,m,num=0,rnum=0,qnum=0,base;
int a[N],p[N],ans[N];
struct replace
{
int pla,pre,suc;
}r[N];
struct query
{
int l,r,t,pos;
}q[N];
int read()
{
int x=0,w=1;
char ch;
ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*w;
}
bool cmp(const query &x,const query &y)
{
if(x.l/base!=y.l/base) return x.l/base<y.l/base;
if(x.r/base!=y.r/base) return x.r/base<y.r/base;
return x.t<y.t;
}
int main()
{
char op[5];
int l1=1,r1=0,ti=0;
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++)
{
scanf("%s",op);
if(op[0]=='R')
{
r[++rnum].pla=read();
r[rnum].suc=read();
r[rnum].pre=a[r[rnum].pla];
a[r[rnum].pla]=r[rnum].suc;
}
else
{
q[++qnum].l=read();
q[qnum].r=read();
q[qnum].pos=qnum;
q[qnum].t=rnum;//记录修改地点QWQ
}
}
base=ceil(exp((log(n)+log(rnum))/3));//ceil:大于或等于该式最小整数
for(int i=rnum;i>=1;i--) a[r[i].pla]=r[i].pre;
sort(q+1,q+qnum+1,cmp);
for(int i=1;i<=m;i++)
{
while(q[i].l<l1) num+=!p[a[--l1]]++;//dalao写法。。。
while(q[i].l>l1) num-=!--p[a[l1++]];
while(q[i].r>r1) num+=!p[a[++r1]]++;
while(q[i].r<r1) num-=!--p[a[r1--]];
while(q[i].t<ti)
{
int pos=r[ti].pla;
if(l1<=pos&&pos<=r1) num-=!--p[a[pos]];
a[pos]=r[ti--].pre;
if(l1<=pos&&pos<=r1) num+=!p[a[pos]]++;
};
while(q[i].t>ti)
{
int pos=r[++ti].pla;
if(l1<=pos&&pos<=r1) num-=!--p[a[pos]];
a[pos]=r[ti].suc;
if(l1<=pos&&pos<=r1) num+=!p[a[pos]]++;
};
ans[q[i].pos]=num;
}
for(int i=1;i<=qnum;i++) printf("%d\n",ans[i]);
return 0;
}