Easy Problem from Rujia Liu?

Though Rujia Liu usually sets hard problems for contests (for example, regional contests like Xi'an 2006, Beijing 2007 and Wuhan 2009, or UVa OJ contests like Rujia Liu's Presents 1 and 2), he occasionally sets easy problem (for example, 'the Coco-Cola Store' in UVa OJ), to encourage more people to solve his problems :D

Given an array, your task is to find the k-th occurrence (from left to right) of an integer v. To make the problem more difficult (and interesting!), you'll have to answer m such queries.

Input

There are several test cases. The first line of each test case contains two integers n, m(1<=n,m<=100,000), the number of elements in the array, and the number of queries. The next line contains n positive integers not larger than 1,000,000. Each of the following m lines contains two integer k and v (1<=k<=n, 1<=v<=1,000,000). The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.

Output

For each query, print the 1-based location of the occurrence. If there is no such element, output 0 instead.

Sample Input

8 4
1 3 2 2 4 3 2 1
1 3
2 4
3 2
4 2

Output for the Sample Input

2
0
7
0

Rujia Liu's Present 3: A Data Structure Contest Celebrating the 100th Anniversary of Tsinghua University
Special Thanks: Yiming Li
Note: Please make sure to test your program with the gift I/O files before submitting!


  STL练习,map+vector。

  题意是“给出一个包含n个整数的数组,你需要回答若干次询问。每次询问两个整数k和v,输出从左到右第k个v的下标(数组下标从左到右编号为1~n)”。

  很显然,这是一个二维的结构,我们用下标代表要查询的数v,a[v][k]就代表第k次出现v的下标值。首先我们会想到开一个二维数组,但是这样空间消耗太大。不如利用C++STL库提供的数据结构来存储,在这里我们可以用 map+vector,申请的变量为为map <int,vector<int> > a。它的好处是存储空间是动态改变的,不用一开始就创建很大的数组来存储。

  代码

 #pragma warning (disable:4786)
#include <stdio.h>
#include <map>
#include <vector>
using namespace std;
int main()
{
int i,n,m,x,k,v;
while(scanf("%d%d",&n,&m)!=EOF){
map <int,vector<int> > a;
for(i=;i<n;i++){ //预处理
scanf("%d",&x);
if(!a.count(x)) //x一次没有出现过
a[x] = vector<int>();
a[x].push_back(i+); //从0开始push
}
//查询
for(i=;i<m;i++){
scanf("%d%d",&k,&v);
if(a.size()<v && a[v].size()<k)
printf("0\n");
else
printf("%d\n",a[v][k-]); //因为是从0开始push,所以k-1
}
}
return ;
}

Freecode : www.cnblogs.com/yym2013

最新文章

  1. 借助node实战WebSocket
  2. linux 安装 python2.7
  3. wamp如何添加多个站点
  4. Objective-C实现发短信和接电话
  5. How to Optimize Battery Health?
  6. 30天轻松学习javaweb_打包web项目成war
  7. USB HID 协议入门
  8. 最简单的视音频播放示例7:SDL2播放RGB/YUV
  9. Java之绘制五环图案
  10. 动态图片 gif
  11. PHP面向对象多态性的应用
  12. Android开发(20)--RadioGroup的使用
  13. Apache POI组件操作Excel,制作报表(二)
  14. ES6-字符串的扩展-模板字符串
  15. Java thrift服务器和客户端创建实例
  16. Dynamics 365-关于Solution的那些事(二)
  17. asp.net core在linux上的部署调试
  18. HDU 6008 - Worried School
  19. 20155238 2016-2017-2 《Java程序设计》第一周学习总结
  20. FireFox火狐不能设置新标签页

热门文章

  1. iOS Xcode 调试技巧 全局断点这样加才有意思
  2. innerText在谷歌、火狐浏览器下的使用
  3. spring mvc静态资源文件的引用
  4. apue第四章学习总结
  5. Borg Maze(MST &amp; bfs)
  6. Unity运行时刻资源管理
  7. nyoj19 全排列
  8. python如何获取某模块的版本信息
  9. load url from future 解释
  10. RabbitMQ消息队列:ACK机制