听说这题的所发和HH的项链很像。

然而那道题我使用莫队写的。。。

这是一个套路,pre数组加升维(在线)。

记录一个\(pre\)数组,\(pre[i]\)代表上一个和i颜色相同的下标。

我们把询问离线,扫一遍\(a\)数组。然后每扫过一个点,就把\(pre[pre[i]]\)这个位置上减1,把\(pre[i]\)加1。然后每一个询问,就输出\([l,r]\)的权值和就行了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N=2010100;
typedef pair<int,int> p;
vector<p> vec[N];
int n,c,m,pre[N],last[N];
long long tr[N],ans[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int w){
if(x==0)return;
for(int i=x;i<=n;i+=lowbit(i))tr[i]+=w;
}
int getsum(int x){
int tmp=0;
for(int i=x;i;i-=lowbit(i))tmp+=tr[i];
return tmp;
}
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int main(){
n=read(),c=read(),m=read();
for(int i=1;i<=n;i++){
int a=read();
pre[i]=last[a];
last[a]=i;
}
for(int i=1;i<=m;i++){
int l=read(),r=read();
vec[r].push_back(make_pair(l,i));
}
for(int i=1;i<=n;i++){
add(pre[pre[i]],-1);
add(pre[i],1);
for(int j=0;j<vec[i].size();j++)
ans[vec[i][j].second]=getsum(i)-getsum(vec[i][j].first-1);
}
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
return 0;
}

最新文章

  1. Birt使用总结
  2. 【转】C#多线程
  3. c++内存分布
  4. Python 中 sqlite3的使用
  5. Stanford机器学习---第九讲. 聚类
  6. [转]SVN-版本控制软件
  7. Centos 6.5编译安装Nginx+php+Mysql
  8. C#向文件写、读数据
  9. NYOJ306 走迷宫(dfs+二分搜索)
  10. ashx页面中context.Session[&quot;xxx&quot;]获取不到值的解决办法
  11. 重启OpenStack服务步骤
  12. SecureCRT使用本地公钥 SSH 免密码登录Linux
  13. django-simple-captcha 验证码插件
  14. 多选下拉框带搜索(aps.net)
  15. PHP之文件上传
  16. 07: Django 使用ldap登录、注销等
  17. mac指令备忘
  18. C#设计模式泛型注入
  19. nancyfx中的静态内容文件夹
  20. MongoDB 学习(一)安装配置和简单应用

热门文章

  1. JS对以对象组成的数组去重
  2. NOIP2018提高组金牌训练营——数论专题
  3. JavaScript中的基础测试题
  4. POI实现Excel2003插入多张图片
  5. 2015 Multi-University Training Contest 4 hdu 5338 ZZX and Permutations
  6. 解决ORA-28002: 密码7天之后过期办法
  7. Oracle expdp导出多表或表中的部分数据
  8. OS - 线程和进程的差别
  9. uva 10641 (来当雷锋的这回....)
  10. 上传文件 nginx 413错误