Cod sursa(job #317515)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 23 mai 2009 20:28:33
Problema Fractal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
long long n,c,l;
long long dist1(long long m,long long l,long long c);//sus
long long dist2(long long m,long long l,long long c);//stanga
long long dist3(long long m,long long l,long long c);//dreapta
long long dist4(long long m,long long l,long long c);//jos

int main()
{
 freopen("fractal.in","r",stdin);
 freopen("fractal.out","w",stdout);
 scanf("%lld%lld%lld",&n,&c,&l);
 long long di=dist1(n,l,c);
 printf("%lld\n",di);
 return 0;
}
long long dist1(long long m,long long l,long long c)//sus
{long long ll=(1<<(m)),x;
 if(!m)return 0;
 if(l>ll/2)
  {l%=(ll/2);
   x=0;
   if(c>(ll/2))x=1;
   c%=(ll/2);
   if(!c)c+=(ll+2);
   return (dist1(m-1,l,c)+(1<<(2*m-2))*(x+1));}
 if(c<=ll/2)
   return dist2(m-1,l,c);
 c-=(ll/2);
 return (dist3(m-1,l,c)+(1<<(2*m-2))*3);
}
long long dist2(long long m,long long l,long long c)//stanga
{long long ll=(1<<(m)),x;
 if(!m)return 0;
 if(c>ll/2)
  {c%=(ll/2);
   x=0;
   if(l>(ll/2))x=1;
   l%=(ll/2);
   if(!l)l+=(ll+2);
   return (dist2(m-1,l,c)+(1<<(2*m-2))*(x+1));}
 if(l<=ll/2)
   return dist1(m-1,l,c);
 l-=(ll/2);
 return (dist4(m-1,l,c)+(1<<(2*m-2))*3);
}
long long dist3(long long m,long long l,long long c)//dreapta
{long long ll=(1<<(m)),x;
 if(!m)return 0;
 if(c<=ll/2)
  {x=0;
   if(l<=(ll/2))x=1;
   l%=(ll/2);
   if(!l)l+=(ll+2);
   return (dist4(m-1,l,c)+(1<<(2*m-2))*(x+1));}
 c-=(ll/2);
 if(l<=ll/2)
   return (dist1(m-1,l,c)+(1<<(2*m-2))*3);
 l-=(ll/2);
 return dist4(m-1,l,c);
}
long long dist4(long long m,long long l,long long c)//jos
{long long ll=(1<<(m)),x;
 if(!m)return 0;
 if(l<=ll/2)
  {x=0;
   if(c<=(ll/2))x=1;
   c%=(ll/2);
   if(!c)c+=(ll+2);
   return (dist4(m-1,l,c)+(1<<(2*m-2))*(x+1));}
 l-=(ll/2);
 if(c<=ll/2)
   return (dist2(m-1,l,c)+(1<<(2*m-2))*3);
 c-=(ll/2);
 return dist3(m-1,l,c);
}