This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=6*1e6+50;
const ll inf=1e9+50;
int root,nc,maks[N],lc[N],rc[N];
int pref[200050],suf[200050];
ll a[200050];
void Update(int &c,ll ss,ll se,int qind,int qval)
{
if(!c) c=++nc;
if(ss==se) {maks[c]=max(maks[c],qval);return;}
ll mid=(ss+se)/2;if(ss+se<0) mid--;
if(qind<=mid) Update(lc[c],ss,mid,qind,qval);
else Update(rc[c],mid+1,se,qind,qval);
maks[c]=max(maks[lc[c]],maks[rc[c]]);
}
int Get(int c,ll ss,ll se,ll qs,ll qe)
{
if(qs>qe || !c) return 0;
if(qs<=ss && se<=qe) return maks[c];
if(qe<ss || se<qs) return 0;
ll mid=(ss+se)/2;if(ss+se<0) mid--;
return max(Get(lc[c],ss,mid,qs,qe),Get(rc[c],mid+1,se,qs,qe));
}
void CLEAR(){
for(int i=0;i<=nc;i++) maks[i]=lc[i]=rc[i]=0;
root=nc=0;
}
int main()
{
int n;ll x;scanf("%i%lld",&n,&x);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
pref[i]=1+Get(root,0,inf,0,a[i]-1);
Update(root,0,inf,a[i],pref[i]);
}
CLEAR();
for(int i=n;i>=1;i--)
{
suf[i]=1+Get(root,0,inf,a[i]+1,inf);
Update(root,0,inf,a[i],suf[i]);
}
CLEAR();
/*for(int i=1;i<=n;i++) printf("%i ",pref[i]);
printf("\n");
for(int i=1;i<=n;i++) printf("%i ",suf[i]);
printf("\n");*/
int res=0;
for(int i=1;i<=n;i++)
{
res=max(res,Get(root,0,2*inf,0,a[i]+x-1)+suf[i]);
Update(root,0,2*inf,a[i],pref[i]);
//printf("%i %i\n",i,res);
}
CLEAR();
for(int i=n;i>=1;i--)
{
res=max(res,pref[i]+Get(root,0,2*inf,a[i]+1,2*inf));
Update(root,0,2*inf,a[i]+x,suf[i]);
}
printf("%i\n",res);
return 0;
}
Compilation message (stderr)
glo.cpp: In function 'int main()':
glo.cpp:32:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
32 | int n;ll x;scanf("%i%lld",&n,&x);
| ~~~~~^~~~~~~~~~~~~~~~
glo.cpp:33:32: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
| ~~~~~^~~~~~~~~~~~~~
# | 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... |