Pagini recente » Cod sursa (job #3158586) | Cod sursa (job #2341186) | Borderou de evaluare (job #335655) | Borderou de evaluare (job #2321000) | Cod sursa (job #400187)
Cod sursa(job #400187)
#include<fstream>
using namespace std;
#define nmax 131075
int maxarb[nmax];
int d[nmax],l,n,maxim,start,finish,val,pos;
void update(int,int,int);
int query(int,int,int);
void citire()
{
ifstream fin("scanduri.in");
fin>>n>>l;
int i;
for(i=1;i<=n;i++)
{
fin>>d[i];
pos=i;val=l;
update(1,1,n);
}
fin.close();
}
int main ()
{
citire();
int i,k=0;
for(i=1;i<=n;i++)
{
start=1;finish=k+1;
maxim=d[i];
pos=query(1,1,n);
if(maxarb[pos]==l) k++;
val=-d[i];
update(1,1,n);
}
ofstream fout("scanduri.out");
fout<<k;
fout.close();
return 0;
}
void update(int nod,int left,int right)
{
if(left==right)
{
maxarb[nod]=maxarb[nod]+val;
return;
}
int mijl=(left+right)/2;
if ( pos <= mijl ) update(2*nod,left,mijl);
else update(2*nod+1,mijl+1,right);
maxarb[nod] = max( maxarb[2*nod], maxarb[2*nod+1] );
}
int query(int nod,int left,int right)
{
if ( start <= left && right <= finish )
{
if ( maxim <= maxarb[nod] ) return nod;
}
int mijl = (left+right)/2;
if ( start <= mijl ) query(2*nod,left,mijl);
if ( mijl < finish ) query(2*nod+1,mijl+1,right);
}