题面:

传送门

思路:

这道题和SDOI2009的HH的项链很像,只是多了一个修改

模板套上去呀

莫队学习请戳这里:莫队

Code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
int n,m,cnt[],tot=,x[],cur[];
int curl,curr,curc,block,ans[],cntq,cntc;
struct query{
int l,r,i,ch;
}a[];
struct ch{
int pos,to,from;
}c[];
bool cmp(query l,query r){
if(l.l/block!=r.l/block) return (l.l/block)<(r.l/block);
else{
if(l.r!=r.r) return l.r<r.r;
else return l.ch<r.ch;
}
}
void add(int i){
cnt[x[i]]++;if(cnt[x[i]]==) tot++;
//cout<<"add "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<" "<<tot<<"\n";
}
void erase(int i){
cnt[x[i]]--;if(!cnt[x[i]]) tot--;
//cout<<"erase "<<i<<" "<<x[i]<<" "<<cnt[x[i]]<<" "<<tot<<"\n";
}
void change(int l,int r,int i){
//cout<<"***change "<<l<<" "<<r<<" "<<i<<" "<<x[c[i].pos]<<"\n";
if(l<=c[i].pos&&c[i].pos<=r) erase(c[i].pos);
x[c[i].pos]=c[i].to;
if(l<=c[i].pos&&c[i].pos<=r) add(c[i].pos);
}
void back(int l,int r,int i){
//cout<<"***back "<<l<<" "<<r<<" "<<i<<"\n";
if(l<=c[i].pos&&c[i].pos<=r) erase(c[i].pos);
x[c[i].pos]=c[i].from;
if(l<=c[i].pos&&c[i].pos<=r) add(c[i].pos);
}
int main(){
// freopen("testdata.in","r",stdin);
int i,t1,t2;char s[];
n=read();m=read();
for(i=;i<=n;i++) x[i]=cur[i]=read();
for(i=;i<=m;i++){
scanf("%s",s);t1=read();t2=read();
if(s[]=='Q')
a[++cntq].l=t1,a[cntq].r=t2,a[cntq].i=cntq,a[cntq].ch=cntc;
else
c[++cntc].pos=t1,c[cntc].from=cur[t1],cur[t1]=c[cntc].to=t2;
}
block=sqrt(n);
sort(a+,a+cntq+,cmp); curl=a[].l;curr=a[].r;
for(i=a[].l;i<=a[].r;i++) add(i);
while(curc<a[].ch) change(a[].l,a[].r,++curc);
ans[a[].i]=tot; for(i=;i<=m;i++){
while(curl<a[i].l) erase(curl++);
while(curl>a[i].l) add(--curl);
while(curr<a[i].r) add(++curr);
while(curr>a[i].r) erase(curr--);
while(curc<a[i].ch) change(a[i].l,a[i].r,++curc);
while(curc>a[i].ch) back(a[i].l,a[i].r,curc--);
ans[a[i].i]=tot;
//cout<<"now "<<curl<<" "<<curr<<"\n";
}
for(i=;i<=cntq;i++) printf("%d\n",ans[i]);
}

最新文章

  1. 自适应网页设计(Responsive Web Design)
  2. 【GO】GO语言学习笔记二
  3. Logistic回归模型和Python实现
  4. 特征脸(Eigenface)理论基础-PCA(主成分分析法)
  5. android 圆角边框及图片
  6. java.io.FileOutputStream类的5个构造方法
  7. iOS 根据字符串来定位地址
  8. 从四大音乐APP首页设计对比分析产品方向
  9. python 简明教程笔记
  10. 4.SQL语言基础
  11. Managing linux Shell Jobs
  12. Java爬虫框架WebMagic——入门(爬取列表类网站文章)
  13. Alpha冲刺No.2
  14. Java核心知识盘点(三)- 框架篇-Spring
  15. java 保证程序安全退出
  16. 匿名内部类可以访问的变量---静态成员变量和final修饰的局部变量
  17. CSS expression属性
  18. Fragment与Activity之间的相互通信
  19. 为什么要重写hashCode()方法和equals()方法及如何重写
  20. 如何删除VS2015中的OpenCV的配置

热门文章

  1. linux 硬链接与软链接的区别
  2. 2018.6.21 css的应用---注册表格
  3. 2017.12.1 如何用java写出一个菱形图案
  4. Java 发送 Http请求工具类
  5. JS中的async/await的执行顺序详解
  6. 自建ssr(谷歌云免费试用一年)
  7. 使用IP地址方法登录MySQL数据库Can&#39;t connect to MySQL server的原因。mysql -h 192.168.1.104 -P3306 -uroot -p 失败
  8. MySQL详细安装过程
  9. tcl之list操作-llength/lindex/lrange/linsert/lreplace
  10. 基于django的个人博客网站建立(二)