Cod sursa(job #2800427)

Utilizator GligarEsterabadeyan Hadi Gligar Data 13 noiembrie 2021 16:56:27
Problema Hashuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#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;
}