Cod sursa(job #125505)

Utilizator ioraIoana Radu iora Data 20 ianuarie 2008 14:08:51
Problema Stergeri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
long nr,n,m,k,i,x,y,j,nn,poz,pp,s,ss,a[100000],b[10000];
int main()
{
	freopen("stergeri.in","r",stdin);
	freopen("stergeri.out","w",stdout);

	scanf("%ld %ld %ld",&n,&m,&k);
	a[1]=1;
	a[2]=n;

  nr=2;
	for(i=1;i<=m;++i)
		{
			scanf("%ld %ld",&x,&y);
			s=0;
			nn=0;
			for(j=1;j<nr;j=j+2)//intervalul in care incepe
				if(s+(a[j+1]-a[j]+1)<x) { s+=a[j+1]-a[j]+1; nn++; b[nn]=a[j]; b[++nn]=a[j+1];}
					else { poz=j; break;}

			if(x-s>1)//daca nu cumva incepe chiar de pe prima poz a interv
			 {
				 b[++nn]=a[j];
				 b[++nn]=a[j]+(x-s)-2;    //am facut un interval nou
				 }
				 //vedem in ce interval se term taierea

				 ss=(a[poz+1]-a[poz]+1)-(x-s)+1;
				 pp=poz;
				 for(j=poz+2;j<nr;j=j+2)
						if(ss+(a[j+1]-a[poz]+1)<(y-x+1)) { ss+=(a[j+1]-a[j]+1); }
						else { pp=j; break;}


				 //daca nu cumva e chair pe ult poz
				 if((y-x+1)-ss!=(a[pp+1]-a[pp]+1))
					 {
							if(pp==poz)//daca e pp=poz

					{
						b[++nn]=(a[poz]+(x-s)-2)+(y-x+1)+1;
						b[++nn]=a[poz+1];
					}
					else
					{
							b[++nn]=a[pp]+((y-x+1)-ss);
							b[++nn]=a[pp+1];
					}
					 }
				 //adaugam celelalte intervale
				 for(j=pp+2;j<nr;j+=2)
						{ b[++nn]=a[j];
							b[++nn]=a[j+1];
						}

				 //noile taieturi le pun in a

				 for(j=1;j<nn;j=j+2)
					 {a[j]=b[j]; a[j+1]=b[j+1];}

				 nr=nn;
			 }


		s=0;
		for(i=1;i<nr;i=i+2)
			if(s+(a[i+1]-a[i]+1)<k) { s+=(a[i+1]-a[i]+1);}
			else { poz=i; break;}
		printf("%ld",a[poz]+(k-s)-1);
		return 0;
}