Pagini recente » Cod sursa (job #2478420) | Borderou de evaluare (job #2663670) | Cod sursa (job #1206832) | Cod sursa (job #413962) | Cod sursa (job #125505)
Cod sursa(job #125505)
#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;
}