哪怕让我过一个点啊!!!
看到推平就果断珂朵莉了,讨论区的对拍数据生成器最多开到50000,50005就会TLE
#include <bits/stdc++.h>
using namespace std;
//Start define.
namespace MySpace{
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x&(-x))
template <typename T>
inline T read(){
register T now=0,nev=1;
register char c=getchar();
while(c<'0' || c>'9') {
if(c=='-') nev=-1;
c=getchar();
}
while(c>='0' && c<='9') now=(now<<1)+(now<<3)+(c&15),c=getchar();
return now*nev;
}
template<typename T>
T qpow(T a,T n,T p){
T res=1;
while (n){
if (n&1) res=1ll*res*a%p;
a=1ll*a*a%p;
n>>=1;
}
return res;
}
template<typename T>
T gcd(T a,T b){return (b>0?gcd(b,a%b):a);}
}
using namespace MySpace;
//const int INF=0x66CCFF66;
typedef pair<int,int> pii;
const int MAXN = 100005;
struct Node{
int l,r;
mutable int v;
Node(int L,int R,int V){
l=L,r=R,v=V;
}
bool operator<(const Node tmp) const{
return l<tmp.l;
}
};
typedef set<Node>::iterator sit;
set<Node> tr;
inline sit split(int pos){
sit x=tr.lower_bound(Node(pos,0,0));
if (x!=tr.end()&&x->l==pos) return x;
x--;
if (x->r < pos) return tr.end();
int l=x->l,r=x->r,v=x->v;
tr.erase(x);
tr.insert(Node(l,pos-1,v));
return tr.insert(Node(pos,r,v)).first;
}
inline void assign(int l,int r,int x,int y){
sit R=split(r+1),L=split(l);
for (sit i=L;i!=R;i++) if (i->v==x) i->v=y;
return;
}
inline int queryK(int l,int r,int k){
sit R=split(r+1),L=split(l);
vector<pii> t;
for (sit i=L;i!=R;i++){
t.push_back(make_pair(i->v,i->r - i->l +1));
}
sort(t.begin(),t.end(),[](pii a,pii b){
return a.first<b.first;
});
int i,End=t.size();
for (i=0;i<End;i++){
if (t[i].second<k) k-=t[i].second;
else break;
}
return t[i].first;
}
int n,m;
int l,r,x,y,k,opt;
int main(){
n=read<int>(),m=read<int>();
for (int i=1;i<=n;i++) tr.insert(Node(i, i, read<int>()));
while (m--){
opt=read<int>(),l=read<int>(),r=read<int>();
if (opt==1){
x=read<int>(),y=read<int>();
assign(l,r,x,y);
}else{
k=read<int>();
printf("%d\n",queryK(l,r,k));
}
}
return 0;
}