Pagini recente » Cod sursa (job #269381) | Cod sursa (job #1142027) | Cod sursa (job #878594) | Cod sursa (job #1965959) | Cod sursa (job #2502312)
#include <bits/stdc++.h>
using namespace std;
const int nmax=200005;
int st[nmax],best[nmax],v[nmax],ind[nmax],sol[nmax];
//stack<int> stiva;
int stivaoptimizat[2*nmax];
map<int,int> mp;
vector< pair<int,int> > ans;
bool mycmp(int a,int b)
{
return v[a]<v[b];
}
int main()
{
freopen("secvmax.in","r",stdin);
freopen("secvmax.out","w",stdout);
int n,i,q,x,y = 0,mi=INT_MAX,vf=0;
scanf("%d%d",&n,&q);
for(i=1;i<=n;++i)
{
scanf("%d",&v[i]);
if(mi>v[i])
mi=v[i];
}
//stanga
// stiva.push(1);
stivaoptimizat[++vf]=1;
st[1]=1;
for(i=2;i<=n;++i)
{
if(v[i-1]>v[i])
{
st[i]=1;
// stiva.push(i);
stivaoptimizat[++vf]=i;
}
else
{
for(;v[stivaoptimizat[vf]]<=v[i] && vf>0;vf--);
// while(!stiva.empty() && v[stiva.top()]<=v[i])
// stiva.pop();
if(vf==0)
st[i]=i;
else
st[i]=i-stivaoptimizat[vf];
// if(stiva.empty())
// st[i]=i;
// else
// st[i]=i-stiva.top();
stivaoptimizat[++vf]=i;
// stiva.push(i);
}
}
vf=0;
//dreapta
// stiva.push(n);
stivaoptimizat[++vf]=n;
best[n]=st[n];
ind[n]=n;
for(i=n-1;i>=1;--i)
{
ind[i]=i;
if(v[i+1]>v[i])
{
best[i]=st[i];
stivaoptimizat[++vf]=i;
// stiva.push(i);
}
else
{
for(;v[stivaoptimizat[vf]]<=v[i] && vf>0;vf--);
// while(!stiva.empty() && v[stiva.top()]<=v[i])
// stiva.pop();
if(vf==0)
best[i]=n-i+st[i];
else
best[i]=stivaoptimizat[vf]-i+st[i]-1;
// if(stiva.empty())
// best[i]=n-i+st[i];
// else
// best[i]=stiva.top()-i+st[i]-1;
stivaoptimizat[++vf]=i;
// stiva.push(i);
}
}
sort(ind+1,ind+n+1,mycmp);
int k=0;
for(i=1;i<=n;++i)
{
ind[++k]=ind[i];
for(;v[ind[k]]==v[ind[i+1]];++i)
best[ind[k]]=max(best[ind[k]],best[ind[i+1]]);
}
n=k;
for(i=1; i<=n; ++i)
sol[i]=max(sol[i-1],best[ind[i]]);
for(i=1;i<=q;++i)
{
scanf("%d",&x);
if(x<mi)
printf("0\n");
else
{
int stg=1,drg=n,mid;
y=0;
while(stg<=drg)
{
mid=(stg+drg)/2;
if(x>=v[ind[mid]])
y=mid,stg=mid+1;
else
drg=mid-1;
}
if(v[ind[y]]>x)
--y;
printf("%d\n",sol[y]);
}
}
/*for(i=1;i<=n;++i)
{
x=st[i]+dr[i]-1;
if(mp[v[i]]<x)
mp[v[i]]=x;
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();++it)
ans.push_back(make_pair(it->first,it->second));
for(i=1;i<=q;++i)
{
scanf("%d",&x);
int stg=0,drg=ans.size()-1,mid,y2;
if(x<ans[0].first)
{
printf("0\n");
continue;
}
while(stg<=drg)
{
mid=(stg+drg)/2;
if(ans[mid].first<=x)
y=mid,stg=mid+1;
else
drg=mid-1;
}
if(ans[y].first>x)
y--;
printf("%d\n",ans[y].second);
}*/
return 0;
}