Cod sursa(job #267001)

Utilizator ConsstantinTabacu Raul Consstantin Data 26 februarie 2009 16:56:23
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

struct groapa{int a, b;}v[100002];
int x[2][100001],j,sol,i,k,l,m,n,ia,ib,fa,fb,mina,minb=100001;

int cmp(groapa a,groapa b){
return a.b<b.b;}

int caut(int val,int l){
int p=1,u=m,mij;

while(p<u)
        {mij=(p+u)>>1;
        if(v[mij].b<val)p=mij+1;
        else
        u=mij;}
if(x[l][val]!=x[v[u].a][v[u].b])
        return 0;
else
        return v[u].b;

}

int main(){

FILE *f=fopen("gropi.in","r");
fscanf(f,"%d %d",&n,&m);

for(i=1;i<=m;i++)
        {fscanf(f,"%d %d",&v[i].a,&v[i].b);
        v[i].a--;
        x[v[i].a][v[i].b]=-1;
        if(v[i].b<minb){
        minb=v[i].b;mina=1-v[i].a;}
        }
k=1;
l=mina;
for(i=1;i<=n;i++)
        {if(x[1-l][i]==-1)
                {k++;l=1-l;}
        x[0][i]=x[1][i]=k;
        }


sort(v+1,v+1+m,cmp);

fscanf(f,"%d",&k);

FILE *g=fopen("gropi.out","w");

for(i=1; i <= k;i++)
        { fscanf(f,"%d %d %d %d",&ia,&ib,&fa,&fb);
        ia--;fa--;
        if(ib>fb)
                {l=ib;ib=fb;fb=l;
                l=ia;ia=fa;fa=l;
                }
       sol=fb-ib+1;

       if(x[ia][ib]!=x[fa][fb])
                {sol+=x[fa][fb]-x[ia][ib];
                if(x[fa][fb]%2==0)
                        {if(fa==1-mina)sol++;}
                else
                        {if(fa==mina)sol++;}
                l=x[ia][ib]%2;
                if(!l)
                        {if(ia==1-mina)
                                if(caut(ib,ia))sol++;
                                else
                                        sol--;}
                else
                        {if(ia==mina)
                                if(caut(ib,ia))sol++;
                                else
                                        sol--;}

                }
     else
        if(caut(ib,ia)!=caut(fb,fa))
         sol+=2;
      fprintf(g,"%d\n",sol);
       }


fclose(f);
fclose(g);
return 0;}