Cod sursa(job #256230)

Utilizator SheepBOYFelix Liviu SheepBOY Data 11 februarie 2009 13:12:14
Problema Stergeri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
struct TETRA{
	int u,l,b;
};
TETRA table[100000];
int nt;
inline int esti_al_meu(int a,TETRA intr)
{
	if(a>intr.l&&a<intr.u)
		return 1;
	if(a>intr.u)
		return 0;
	if(a<intr.l)
		return -1;
}
inline int intersect(int l,int u,TETRA &intrv)
{
	int aux;
	if(l<=intrv.u&&u>=intrv.l)
	{
		aux=(u+1)-l+intrv.b;
		intrv.l=l;
		intrv.u=(u>intrv.u)?u:intrv.u;
		intrv.b=aux;
	}
	if(l>=intrv.l&&l<=intrv.u&&u>=intrv.u)
	{
		aux=((u+1)-l)+intrv.b;
		intrv.l=(l>intrv.l)?l:intrv.l;
		intrv.u=u;
		intrv.b=aux;
	}
	if((u+u+1-l)>=intrv.l)
	{
		aux=u-1;
		while((aux+u+1-l)>=intrv.l&&aux>=l)
			--aux;
		++aux;
		table[nt].l=aux;
		table[nt].u=u;
		table[nt++].b=u+1-l+intrv.b;
		if(aux>l)
		{
		table[nt].l=l;
		table[nt].u=aux-1;
		table[nt++].b=u+1-l;
		}
	}
}
int main()
{
	int entr,aux,i,u,l,n,m,k;
	freopen("stergeri.in","r",stdin);
	freopen("stergeri.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	while(m)
	{
		scanf("%d%d",&l,&u);
			entr=0;
		for(i=0;i<nt;++i)
			if(intersect(l,u,table[i]))
			{
				entr=1;
				break;
			}
		if(!entr)
		{
			table[nt].l=l;
			table[nt].u=u;
			table[nt++].b=u+1-l;
		}
			--m;
	}
	int last=-1;
	entr=0;
	for(i=0;i<nt;++i)
	{
		aux=esti_al_meu(k,table[i]);
		if(!aux)
		last=i;
		if(aux>0)
			{printf("%d",k+table[i].b);entr=1;break;}
		if(aux<0)
			break;
	}
	if(!entr&&last>-1)
	printf("%d",k+table[last].b);
	else
		printf("%d",k);
	return 0;
}