#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
const int TAILLEMAXI=(1<<19),DECA=(1<<18);
vector<pair<int,int>> tries;
int prefixe[DECA],suffixe[DECA];
int arbre[TAILLEMAXI][3];
int nbval,decamax;
int place[DECA],apres[DECA];
int maxi(int a,int b,int tab){
if (a==b){
return arbre[a][tab];
}
if (a%2==1){
return max(arbre[a][tab],maxi(a+1,b,tab));
}
if (b%2==0){
return max(arbre[b][tab],maxi(a,b-1,tab));
}
return maxi(a/2,b/2,tab);
}
void change(int a,int tab){
while (a>1){
a/=2;
arbre[a][tab]=max(arbre[a*2][tab],arbre[a*2+1][tab]);
}
}
void lecture(){
cin>>nbval>>decamax;
for (int i=0;i<nbval;i++){
int val;
cin>>val;
tries.push_back({val,-i});
}
sort(tries.begin(),tries.end());
}
void pref(){
for (auto i:tries){
int pos=-i.second;
prefixe[pos]=maxi(DECA,DECA+pos,0)+1;
arbre[DECA+pos][0]=prefixe[pos];
change(DECA+pos,0);
}
}
void suff(){
for (int j=nbval-1;j>=0;j--){
int i=-tries[j].second;
suffixe[i]=maxi(DECA+i,DECA+nbval,1)+1;
arbre[DECA+i][1]=suffixe[i];
change(DECA+i,1);
}
}
void construire(){
for (int i=0;i<nbval;i++){
place[tries[i].second]=i;
}
int a=0,b=0;
/*for (int i=0;i<nbval;i++){
cout<<tries[i].first-decamax<<" ";
}
cout<<endl;
for (int i=0;i<nbval;i++){
cout<<tries[i].first<<" ";
}
cout<<endl;
return ;*/
while (a<nbval and b<nbval){
if (tries[a].first-decamax<tries[b].first){
apres[-tries[a].second]=b;
//cout<<a<<endl;
a++;
}
else {
b++;
}
}
if (b==nbval){
for (int i=a;i<nbval;i++){
apres[-tries[a].second]=nbval;
}
}
}
int trouver(){
int rep=0;
for (int i=nbval-1;i>=0;i--){
rep=max(rep,prefixe[i]+maxi(apres[i]+DECA,nbval+DECA,2));
arbre[place[i]+DECA][2]=suffixe[i];
change(place[i]+DECA,2);
}
return rep;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
lecture();
pref();
suff();
construire();
cout<<trouver()<<endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |