rt,写的是莫队+vector,看题解也有这样做的,可能写假了?
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000010;
inline int read()
{
register int x=0;
register char c=getchar();
for(;!(c>='0'&&c<='9');c=getchar());
for(;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+c-'0';
return x;
}
int n,Q,qn;
int a[maxn];
vector<int>v;
struct p
{
int x,y,k,h,ans;
}q[maxn];
bool cmp1(p a,p b)
{
if((a.x-1)/qn+1==(b.x-1)/qn+1)
return (a.y-1)/qn+1<(b.y-1)/qn+1;
return (a.x-1)/qn+1<(b.x-1)/qn+1;
}
bool cmp2(p a,p b)
{
return a.h<b.h;
}
signed main()
{
n=read(),Q=read(),qn=sqrt(n);
for(register int i=1;i<=n;i++)
a[i]=read();
for(register int i=1;i<=Q;i++)
q[i].h=i,q[i].x=read(),q[i].y=read(),q[i].k=read();
sort(q+1,q+1+Q,cmp1);
for(register int i=q[1].x;i<=q[1].y;i++)
v.insert(lower_bound(v.begin(),v.end(),a[i]),a[i]);
if(q[1].k<=q[1].y-q[1].x+1)
q[1].ans=v[q[1].k-1];
else
q[1].ans=1;
register int l=q[1].x,r=q[1].y;
for(register int i=2;i<=Q;i++)
{
while(l>q[i].x)
l--,v.insert(lower_bound(v.begin(),v.end(),a[l]),a[l]);
while(r<q[i].y)
r++,v.insert(lower_bound(v.begin(),v.end(),a[r]),a[r]);
while(l<q[i].x)
v.erase(lower_bound(v.begin(),v.end(),a[l])),l++;
while(r>q[i].y)
v.erase(lower_bound(v.begin(),v.end(),a[r])),r--;
if(q[i].k<=q[i].y-q[i].x+1)
q[i].ans=v[q[i].k-1];
else
q[i].ans=1;
}
sort(q+1,q+1+Q,cmp2);
for(register int i=1;i<=Q;i++)
printf("%d\n",q[i].ans);
return 0;
}
求帮忙看看,如果是被卡常了,劳烦给些卡常建议/kel