C题。考虑从小到大插入每一个数,然后计算一下每个数之间的最大长度是多少,用set维护一下已经插入的位置,再用multiset维护一下所有区间的长度,最后询问的时候二分一下就行。
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int MAXN=2e5+5;
void solve()
{
int n;
cin>>n;
vector<pair<int,int>> a(n);
for(int i=0;i<n;i++)
{
cin>>a[i].first;
a[i].second=i+1;
}
bool L=0,R=0;
sort(a.begin(),a.end());
vector<int> num(n);
multiset<int> q;
set<int> s;
for(int i=0;i<n;i++)
{
if(i==0)
{
int x=a[i].second-1,y=n-a[i].second;
q.insert(a[i].second-1);
q.insert(n-a[i].second);
s.insert(a[i].second);
num[i]=*q.rbegin();
continue;
}
auto l=prev(s.upper_bound(a[i].second));
auto r=s.upper_bound(a[i].second);
// if(i==2)
// {
// cout<<*s.begin()<<endl;
// cout<<a[i].second<<endl;
// }
if(*s.begin()>a[i].second)
{
int len=*r-1,x=*r-a[i].second-1,y=a[i].second-1;
if(q.find(len)!=q.end()) q.erase(q.find(len));
q.insert(*r-a[i].second-1);
q.insert(a[i].second-1);
s.insert(a[i].second);
num[i]=*q.rbegin();
continue;
}
if(r==s.end())
{
int len=n-*l,x=n-a[i].second,y=a[i].second-*l-1;
if(q.find(len)!=q.end()) q.erase(q.find(len));
q.insert(n-a[i].second);
q.insert(a[i].second-*l-1);
s.insert(a[i].second);
num[i]=*q.rbegin();
continue;
}
int len=*r-*l-1,x=*r-a[i].second-1,y=a[i].second-*l-1;
if(q.find(len)!=q.end()) q.erase(q.find(len));
q.insert(*r-a[i].second-1);
q.insert(a[i].second-*l-1);
s.insert(a[i].second);
num[i]=*q.rbegin();
}
vector<int>temp;
for(int i=0;i<n;i++) temp.push_back(a[i].first);
int m;
cin>>m;
while(m--)
{
int v,l,r;
cin>>v>>l>>r;
int pos=lower_bound(temp.begin(),temp.end(),v)-temp.begin();
if(pos==n)
{
cout<<"No\n";
continue;
}
int len;
if(pos==0)
{
len=n;
}
else len=num[pos-1];
if(len>=l)
{
cout<<"Yes\n";
}
else cout<<"No\n";
}
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
while(t--) solve();
return 0;
}