分析:

听说主席树和莫队可以做,前者不想写,后者我不会...

我们考虑将询问离线,按照左端点排序,之后先处理好从1开始选的答案,之后枚举从1到n,之后依次删除nxt[i],添加nxt[nxt[i]],之后当询问左端点等于i的时候,更新答案。

附上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
#define N 1000005
int n,m,a[N],vis[N],nxt[N],sum[N];
int find(int x)
{
int ret=0;
for(int i=x;i;i-=i&-i)ret+=sum[i];
return ret;
}
void fix(int x,int c)
{
for(int i=x;i<N;i+=i&-i)sum[i]+=c;
}
struct node
{
int idx,l,r,ans;
}q[N];
bool cmp(const node &a,const node &b){return a.l<b.l;}
bool cmp1(const node &a,const node &b){return a.idx<b.idx;}
int main()
{
scanf("%d%*d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(vis[a[i]])nxt[vis[a[i]]]=i;
vis[a[i]]=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);q[i].idx=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1;i<=n;i++)
{
if(nxt[i])fix(nxt[i],1);
if(nxt[nxt[i]]) fix(nxt[nxt[i]],-1);
}
int h=1;
for(int i=1;i<=n;i++)
{
while(q[h].l==i)q[h].ans=find(q[h].r)-find(i-1),h++;
if(nxt[i])fix(nxt[i],-1);
if(nxt[nxt[i]])fix(nxt[nxt[i]],1);
}
sort(q+1,q+m+1,cmp1);
for(int i=1;i<=m;i++)
{
printf("%d\n",q[i].ans);
}
return 0;
}

  

最新文章

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - .NET商业化成品成熟各种数据权限的需求对应例子代码
  2. 411. Minimum Unique Word Abbreviation
  3. [SAP ABAP开发技术总结]将文件存储到数据库表中,并可发送邮件
  4. Python时间和日期学习
  5. js运动
  6. java.util.logging.Logger基础教程
  7. C#如何在panl控件上添加Form窗体
  8. Unity下载
  9. Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk
  10. win7 安装用mingw编译的Qt源码并连接postgresql
  11. Django09-中间件
  12. vue图片上传
  13. LINUX LVM和快照卷配置和管理
  14. JS创建对象之动态原型模式
  15. 7.mysql-安装和卸载.md
  16. SQL表两列取一列唯一值的记录
  17. Java练习之使用StringBuilder
  18. L229 词汇题
  19. Oracle基础了解
  20. Dnsmasq简介

热门文章

  1. 【代码笔记】iOS-计算时间差
  2. windows下安装composer方法
  3. Bootstrap源码分析系列之整体架构
  4. Cordova-conifg.xml配置
  5. 谨慎使用MyBatis自动生成Where语句
  6. centOS7中Mariadb数据库安装与基本管理
  7. 树莓派踩坑备忘录 -- 使用 Linux
  8. SHGetFileInfo 报错 异常 问题
  9. ConstraintLayout使用手册
  10. 树莓派3B+ wifi 5G连接