Cod sursa(job #400187)

Utilizator cezyGrigore Cezar cezy Data 21 februarie 2010 12:12:34
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#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); 
}