#ifndef VARS
#define VARS
int a[1500];
float b[10][15][10];
__attribute__((noreturn)) void
noreturn (void)
{
  for (;;);
}
#endif
#ifndef SC
#define SC
#endif
#ifndef OMPTGT
#define OMPTGT
#endif
#ifndef OMPTO
#define OMPTO(v) do {} while (0)
#endif
#ifndef OMPFROM
#define OMPFROM(v) do {} while (0)
#endif

#ifndef CONDNE
__attribute__((noinline, noclone)) void
N(f0) (void)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 0; i < 1500; i++)
    a[i] += 2;
}

__attribute__((noinline, noclone)) void
N(f1) (void)
{
  OMPTGT
#pragma omp F S
  for (unsigned int i = __INT_MAX__; i < 3000U + __INT_MAX__; i += 2)
    a[(i - __INT_MAX__) >> 1] -= 2;
}

__attribute__((noinline, noclone)) void
N(f2) (void)
{
  unsigned long long i;
  OMPTGT
#pragma omp F S
  for (i = __LONG_LONG_MAX__ + 4500ULL - 27;
       i > __LONG_LONG_MAX__ - 27ULL; i -= 3)
    a[(i + 26LL - __LONG_LONG_MAX__) / 3] -= 4;
}

__attribute__((noinline, noclone)) void
N(f3) (long long n1, long long n2, long long s3)
{
  OMPTGT
#pragma omp F S
  for (long long i = n1 + 23; i > n2 - 25; i -= s3)
    a[i + 48] += 7;
}

__attribute__((noinline, noclone)) void
N(f4) (void)
{
  unsigned int i;
  OMPTGT
#pragma omp F S
  for (i = 30; i < 20; i += 2)
    a[i] += 10;
}

__attribute__((noinline, noclone)) void
N(f5) (int n11, int n12, int n21, int n22, int n31, int n32,
       int s1, int s2, int s3)
{
  SC int v1, v2, v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = n11; v1 < n12; v1 += s1)
    for (v2 = n21; v2 < n22; v2 += s2)
      for (v3 = n31; v3 < n32; v3 += s3)
	b[v1][v2][v3] += 2.5;
}

__attribute__((noinline, noclone)) void
N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32,
       int s1, int s2, long long int s3)
{
  SC int v1, v2;
  SC long long v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = n11; v1 > n12; v1 += s1)
    for (v2 = n21; v2 > n22; v2 += s2)
      for (v3 = n31; v3 > n32; v3 += s3)
	b[v1][v2 / 2][v3] -= 4.5;
}

__attribute__((noinline, noclone)) void
N(f7) (void)
{
  SC unsigned int v1, v3;
  SC unsigned long long v2;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = 0; v1 < 20; v1 += 2)
    for (v2 = __LONG_LONG_MAX__ + 16ULL;
	 v2 > __LONG_LONG_MAX__ - 29ULL; v2 -= 3)
      for (v3 = 10; v3 > 0; v3--)
	b[v1 >> 1][(v2 - __LONG_LONG_MAX__ + 64) / 3 - 12][v3 - 1] += 5.5;
}

__attribute__((noinline, noclone)) void
N(f8) (void)
{
  SC long long v1, v2, v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = 0; v1 < 20; v1 += 2)
    for (v2 = 30; v2 < 20; v2++)
      for (v3 = 10; v3 < 0; v3--)
	b[v1][v2][v3] += 5.5;
}

__attribute__((noinline, noclone)) void
N(f9) (void)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 20; i < 10; i++)
    {
      a[i] += 2;
      noreturn ();
      a[i] -= 4;
    }
}

__attribute__((noinline, noclone)) void
N(f10) (void)
{
  SC int i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = 0; i < 10; i++)
    for (int j = 10; j < 8; j++)
      for (long k = -10; k < 10; k++)
	{
	  b[i][j][k] += 4;
	  noreturn ();
	  b[i][j][k] -= 8;
	}
}

__attribute__((noinline, noclone)) void
N(f11) (int n)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 20; i < n; i++)
    {
      a[i] += 8;
      noreturn ();
      a[i] -= 16;
    }
}

__attribute__((noinline, noclone)) void
N(f12) (int n)
{
  SC int i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = 0; i < 10; i++)
    for (int j = n; j < 8; j++)
      for (long k = -10; k < 10; k++)
	{
	  b[i][j][k] += 16;
	  noreturn ();
	  b[i][j][k] -= 32;
	}
}

__attribute__((noinline, noclone)) void
N(f13) (void)
{
  int *i;
  OMPTGT
#pragma omp F S
  for (i = a; i < &a[1500]; i++)
    i[0] += 2;
}

__attribute__((noinline, noclone)) void
N(f14) (void)
{
  SC float *i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = &b[0][0][0]; i < &b[0][0][10]; i++)
    for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)
      for (float *k = &b[0][0][10]; k > &b[0][0][0]; --k)
	b[i - &b[0][0][0]][(j - &b[0][0][0]) / 10 - 1][(k - &b[0][0][0]) - 1]
	  -= 3.5;
}

__attribute__((noinline, noclone)) int
N(test) (void)
{
  int i, j, k;
  for (i = 0; i < 1500; i++)
    a[i] = i - 25;
  OMPTO (a);
  N(f0) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 23)
      return 1;
  N(f1) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 25)
      return 1;
  N(f2) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 29)
      return 1;
  N(f3) (1500LL - 1 - 23 - 48, -1LL + 25 - 48, 1LL);
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  N(f3) (1500LL - 1 - 23 - 48, 1500LL - 1, 7LL);
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  N(f4) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	b[i][j][k] = i - 2.5 + 1.5 * j - 1.5 * k;
  OMPTO (b);
  N(f5) (0, 10, 0, 15, 0, 10, 1, 1, 1);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.5 * j - 1.5 * k)
	  return 1;
  N(f5) (0, 10, 30, 15, 0, 10, 4, 5, 6);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.5 * j - 1.5 * k)
	  return 1;
  N(f6) (9, -1, 29, 0, 9, -1, -1, -2, -1);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i - 4.5 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f7) ();
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f8) ();	  
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f9) ();
  N(f10) ();
  N(f11) (10);
  N(f12) (12);
  OMPFROM (a);
  OMPFROM (b);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f13) ();
  N(f14) ();
  OMPFROM (a);
  OMPFROM (b);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 20)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i - 2.5 + 1.5 * j - 1.5 * k)
	  return 1;
  return 0;
}

#else

__attribute__((noinline, noclone)) void
N(f20) (void)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 0; i != 1500; i++)
    a[i] += 2;
}

__attribute__((noinline, noclone)) void
N(f21) (void)
{
  OMPTGT
#pragma omp F S
  for (unsigned int i = __INT_MAX__; i < 1500U + __INT_MAX__; i += 2 - 1)
    a[(i - __INT_MAX__)] -= 2;
}

__attribute__((noinline, noclone)) void
N(f22) (void)
{
  unsigned long long i;
  OMPTGT
#pragma omp F S
  for (i = __LONG_LONG_MAX__ + 1500ULL - 27;
       i != __LONG_LONG_MAX__ - 27ULL; i -= 3 - 2)
    a[i + 26LL - __LONG_LONG_MAX__] -= 4;
}

__attribute__((noinline, noclone)) void
N(f23) (long long n1, long long n2)
{
  OMPTGT
#pragma omp F S
  for (long long i = n1 + 23; i != n2 - 25; --i)
    a[i + 48] += 7;
}

__attribute__((noinline, noclone)) void
N(f24) (void)
{
  unsigned int i;
  OMPTGT
#pragma omp F S
  for (i = 30; i != 30; i += 1)
    a[i] += 10;
}

__attribute__((noinline, noclone)) void
N(f25) (int n11, int n12, int n21, int n22, int n31, int n32,
	int s2)
{
  SC int v1, v2, v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = n11; v1 != n12; v1 += 17 - 19 + 3)
    for (v2 = n21; v2 < n22; v2 += s2)
      for (v3 = n31; v3 != n32; ++v3)
	b[v1][v2][v3] += 2.5;
}

__attribute__((noinline, noclone)) void
N(f26) (int n11, int n12, int n21, int n22, long long n31, long long n32,
	int s2)
{
  SC int v1, v2;
  SC long long v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = n11; v1 != n12; v1 += -1)
    for (v2 = n21; v2 > n22; v2 += s2)
      for (v3 = n31; v3 != n32; v3 --)
	b[v1][v2 / 2][v3] -= 4.5;
}

__attribute__((noinline, noclone)) void
N(f27) (void)
{
  SC unsigned int v1, v3;
  SC unsigned long long v2;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = 0; v1 < 20; v1 += 2)
    for (v2 = __LONG_LONG_MAX__ + 11ULL;
	 v2 != __LONG_LONG_MAX__ - 4ULL; -- v2)
      for (v3 = 10; v3 != 0; v3--)
	b[v1 >> 1][v2 - __LONG_LONG_MAX__ + 3][v3 - 1] += 5.5;
}

__attribute__((noinline, noclone)) void
N(f28) (void)
{
  SC long long v1, v2, v3;
  OMPTGT
#pragma omp F S collapse(3)
  for (v1 = 0; v1 != 20; v1 -= 17 - 18)
    for (v2 = 30; v2 < 20; v2++)
      for (v3 = 10; v3 < 0; v3--)
	b[v1][v2][v3] += 5.5;
}

__attribute__((noinline, noclone)) void
N(f29) (void)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 20; i != 20; i++)
    {
      a[i] += 2;
      noreturn ();
      a[i] -= 4;
    }
}

__attribute__((noinline, noclone)) void
N(f30) (void)
{
  SC int i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = 0; i != 10; i++)
    for (int j = 10; j < 8; j++)
      for (long k = -10; k != 10; k++)
	{
	  b[i][j][k] += 4;
	  noreturn ();
	  b[i][j][k] -= 8;
	}
}

__attribute__((noinline, noclone)) void
N(f31) (int n)
{
  int i;
  OMPTGT
#pragma omp F S
  for (i = 20; i != n; i++)
    {
      a[i] += 8;
      noreturn ();
      a[i] -= 16;
    }
}

__attribute__((noinline, noclone)) void
N(f32) (int n)
{
  SC int i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = 0; i != 10; i++)
    for (int j = n; j != 12; j++)
      for (long k = -10; k != 10; k++)
	{
	  b[i][j][k] += 16;
	  noreturn ();
	  b[i][j][k] -= 32;
	}
}

__attribute__((noinline, noclone)) void
N(f33) (void)
{
  int *i;
  OMPTGT
#pragma omp F S
  for (i = a; i != &a[1500]; i++)
    i[0] += 2;
}

__attribute__((noinline, noclone)) void
N(f34) (void)
{
  SC float *i;
  OMPTGT
#pragma omp F S collapse(3)
  for (i = &b[0][0][0]; i != &b[0][0][10]; i++)
    for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)
      for (float *k = &b[0][0][10]; k != &b[0][0][0]; --k)
	b[i - &b[0][0][0]][(j - &b[0][0][0]) / 10 - 1][(k - &b[0][0][0]) - 1]
	  -= 3.5;
}

__attribute__((noinline, noclone)) int
N(test) (void)
{
  int i, j, k;
  for (i = 0; i < 1500; i++)
    a[i] = i - 25;
  OMPTO (a);
  N(f20) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 23)
      return 1;
  N(f21) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 25)
      return 1;
  N(f22) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 29)
      return 1;
  N(f23) (1500LL - 1 - 23 - 48, -1LL + 25 - 48);
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  N(f24) ();
  OMPFROM (a);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	b[i][j][k] = i - 2.5 + 1.5 * j - 1.5 * k;
  OMPTO (b);
  N(f25) (0, 10, 0, 15, 0, 10, 1);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.5 * j - 1.5 * k)
	  return 1;
  N(f25) (0, 10, 30, 15, 0, 10, 5);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.5 * j - 1.5 * k)
	  return 1;
  N(f26) (9, -1, 29, 0, 9, -1, -2);
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i - 4.5 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f27) ();
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f28) ();
  OMPFROM (b);
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f29) ();
  N(f30) ();
  N(f31) (20);
  N(f32) (12);
  OMPFROM (a);
  OMPFROM (b);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 22)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i + 1.0 + 1.5 * j - 1.5 * k)
	  return 1;
  N(f33) ();
  N(f34) ();
  OMPFROM (a);
  OMPFROM (b);
  for (i = 0; i < 1500; i++)
    if (a[i] != i - 20)
      return 1;
  for (i = 0; i < 10; i++)
    for (j = 0; j < 15; j++)
      for (k = 0; k < 10; k++)
	if (b[i][j][k] != i - 2.5 + 1.5 * j - 1.5 * k)
	  return 1;
  return 0;
}
#endif
