http://codeforces.com/contest/658/problem/B
题意 给n,k,q;
就是让你维护一个kmax的集合
q次操作
操作1 把 节点v加入kmax集合,
操作2 查询v是否在集合里
直接用multiset。就好了。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 min(__int64 a,__int64 b)
{return a<b?a:b;}
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}
struct node
{
int x,val;
node(){}
node(int a,int b){x=a,val=b;}
bool operator <(const node &b) const
{
return val<b.val;//最小值优先
}
bool operator ==(const node &b) const
{
return x==b.x;
}
};
multiset<node> q;
int n,k,qq;
int t[150005];
node tmp[8];
int main()
{ int i,j;
scanf("%d%d%d",&n,&k,&qq);
for (i=1;i<=n;i++)
scanf("%d",&t[i]);
int cur=0,x,y;
for (i=1;i<=qq;i++)
{
scanf("%d%d",&x,&y);
if (x==1)
{
if (cur<k)
{
q.insert(node(y,t[y]));
cur++;
}
else
{
q.insert(node(y,t[y]));
// printf("%d\n",q.begin()->x);
q.erase(q.begin());
}
}
else
{
int flag=0;
if (q.find(node(y,t[y]))!=q.end())
flag=1;
if (flag) printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}