Pagini recente » Cod sursa (job #2368947) | Cod sursa (job #3169405) | Diferente pentru problema/rollercoaster intre reviziile 23 si 24 | Cod sursa (job #946988) | Cod sursa (job #2800427)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("secvmax.in");
ofstream fout("secvmax.out");
const int nmax=100000, mmax=100000;
int v[nmax+1], vp[nmax+1], q[mmax+1], qp[mmax+1], r[mmax+1], c[mmax+1], solc[mmax+1];
struct cmp1{
bool operator()(int x, int y){
return v[x]<v[y];
}
};
struct cmp2{
bool operator()(int x, int y){
return q[x]<q[y];
}
};
void update(int x){
int i=x;
while(i!=r[i]){
i=r[i];
}
int j=x;
while(r[j]!=r[r[j]]){
int aux=r[j];
r[j]=i;
j=aux;
}
}
void vecin(int x, int y){
update(y);
c[r[y]]+=c[r[x]];
r[r[x]]=r[y];
r[x]=r[y];
}
int main(){
int n,m;
fin>>n>>m;
for(int i=1;i<=n;i++){
fin>>v[i];
vp[i]=i;
}
sort(vp+1,vp+n+1,cmp1());
for(int i=1;i<=m;i++){
fin>>q[i];
qp[i]=i;
}
sort(qp+1,qp+m+1,cmp2());
int sol=0;
for(int j=1,i=1;j<=m;j++){
while(i<=n&&q[qp[j]]>=v[vp[i]]){
int x=vp[i];
i++;
r[x]=x;
c[x]=1;
if(r[x+1]!=0){
vecin(x,x+1);
}
if(r[x-1]!=0){
vecin(x,x-1);
}
if(sol<c[r[x]]){
sol=c[r[x]];
}
}
solc[qp[j]]=sol;
}
for(int i=1;i<=m;i++){
fout<<solc[i]<<"\n";
}
return 0;
}