Cod sursa(job #197690)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 5 iulie 2008 13:56:03
Problema Gropi Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.84 kb
#include<fstream>
using namespace std;
fstream in,out;
long c,n,m,aux;
long sm,i,j,k;
long x1,y1,x2,y2;
long p1,p2;
long x,y;
long s[2][100000];
long v[200000];

int divide(long p,long q)
  {
  long st=p,dr=q,x=s[1][p],y=s[0][p];
  while(st<dr)
    {
    while(st<dr&&s[1][dr]>=x) dr--;
    s[0][st]=s[0][dr];
    s[1][st]=s[1][dr];
    while(st<dr&&s[1][st]<=x) st++;
    s[0][dr]=s[0][st];
    s[1][dr]=s[1][st];
    }
  s[1][st]=x;
  s[0][st]=y;
  return st;
  }

void qsort(long p,long q)
  {
  long m=divide(p,q);
  if(m-1>p) qsort(p,m-1);
  if(m+1<q) qsort(m+1,q);
  }

/*long caut_binar(long y, long &p)
{
s[0][0]=0; s[1][0]=0;
s[0][n+1]=0; s[1][n+1]=c+1;

long l,h,r;
l=0;h=n+1;r=-1;
while ((l<=h)&&(r==-1))
  {
  m=(l+h)/2;
  if (s[1][m]==y)r=m;
  if (s[1][m]<y)l=m+1;
  if (s[1][m]>y)h=m-1;
  }
if (r>-1) return 1+s[0][r];
   else return s[0][l];
} */

int main()
{
in.open("gropi.in",ios::in);
out.open("gropi.out",ios::out);
in>>c>>n;
for(i=1;i<=n;i++)
  in>>s[0][i]>>s[1][i];
qsort(1,n);
for(j=i=1;i<=c;i++)
  {
  if(s[1][j]==i && s[0][j]!=s[0][j-1]) v[i]=v[i-1]+1;
  else v[i]=v[i-1];
  if(i>=s[1][j]) j++;
  }
in>>m;
for(i=1;i<=m;i++)
  {
  in>>p1>>x>>p2>>y;
  if(x>y) { aux=x; x=y; y=aux; }
  sm=v[y]-v[x];
  if(p1==p2 && sm!=0 && sm%2!=0)
    sm=sm+1+y-x+1;
  else sm=sm+y-x+1;
  out<<sm<<"\n";
  }

/*b[1]=0;
for (i=2;i<=n;i++)
   if (s[0][i-1]==s[0][i]) b[i]=b[i-1]+s[1][i]-s[1][i-1];
	else b[i]=b[i-1]+s[1][i]-s[1][i-1] + 1;
in>>m;
for (i=1;i<=m;i++)
 {
 in>>x1>>y1>>x2>>y2;
 caut_binar(y1,p1);//prima groapa care urmeaza pozitiei (x1,y1) este (a[0][p1],a[1][p1]) cu a[1][p1]>y1
 caut_binar(y2,p2);//ultima groapa care precede pozitia (x2,y2) este (a[0][p2],a[1][p2]) cu a[1][p2]<y2
 sm=p1+1-y1+b[p2]-b[p1]+p2-y2;
 out<<sm<<endl;
 }*/

in.close();
out.close();
return 0;
}