Problem p00820 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <array>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
const int MOD = 1000000007;
const int INF = 1000000000;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const double eps = 1e-9;
const int inf = 1e9;
typedef pair<int, int> P;
struct Point {
  double x, y;
  Point() {
    x = 0;
    y = 0;
  }
  Point(double d_x, double d_y) { x = d_x, y = d_y; }
  double operator*(Point obj) { return obj.x * x + obj.y * y; }
  double operator%(Point obj) { return obj.y * x - obj.x * y; }
  Point operator*(double b) {
    Point tmp;
    tmp.x = x * b;
    tmp.y = y * b;
    return tmp;
  }
  Point operator/(double b) {
    Point tmp;
    tmp.x = x / b;
    tmp.y = y / b;
    return tmp;
  }
  Point operator+(Point obj) {
    Point tmp;
    tmp.x = x + obj.x;
    tmp.y = y + obj.y;
    return tmp;
  }
  Point operator-() {
    Point tmp;
    tmp.x = -x;
    tmp.y = -y;
    return tmp;
  }
  Point operator-(Point obj) {
    Point tmp;
    tmp.x = x - obj.x;
    tmp.y = y - obj.y;
    return tmp;
  }
  Point operator-=(Point obj) {
    x -= obj.x;
    y -= obj.y;
    return *this;
  }
  Point operator+=(Point obj) {
    x += obj.x;
    y += obj.y;
    return *this;
  }
  Point operator/=(double b) {
    x = x / b;
    y = y / b;
    return *this;
  }
  Point operator*=(double b) {
    x = x * b;
    y = y * b;
    return *this;
  }
  double size() { return hypot(x, y); }
  Point unit() { return Point(x / size(), y / size()); }
  Point normal() { return Point(y, -x); }
  double atan() { return atan2(y, x); }
};

bool operator<(Point a, Point b) { return a.x != b.x ? a.x < b.x : a.y < b.y; }
bool operator>(Point a, Point b) { return b < a; }
bool operator<=(Point a, Point b) { return !(b < a); }
bool operator>=(Point a, Point b) { return !(a < b); }
bool operator==(Point a, Point b) { return (a - b).size() < eps; }
bool operator!=(Point a, Point b) { return !(a == b); }

bool equal(double a, double b) { return abs(a - b) < eps; }
double cross(Point a, Point b) { return a % b; }
double dot(Point a, Point b) { return a * b; }

int ccw(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  if (b % c > 0)
    return +1;
  else if (b % c < 0)
    return -1;
  else if (b * c < 0)
    return +2;
  else if (b.size() < c.size())
    return -2;
  else
    return 0;
}

ll n;

int main(int argc, char const *argv[]) {
  while (1) {
    cin >> n;
    if (!n)
      break;
    int ans = 0;
    for (ll i = 1; i * i <= n; i++) {
      if (i * i == n)
        ans++;
      for (int j = i; j * j <= n; j++) {
        if (i * i + j * j == n)
          ans++;
        for (int k = j; k * k <= n; k++) {
          if (i * i + j * j + k * k == n)
            ans++;
          for (int l = k; l * l <= n; l++) {
            if (i * i + j * j + k * k + l * l == n)
              ans++;
          }
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <vector>
const int MOD = 1000000007;
const int INF = 1000000000;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const double eps = 1e-9;
const int inf = 1e9;
typedef pair<int, int> P;
struct Point {
  double x, y;
  Point() {
    x = 0;
    y = 0;
  }
  Point(double d_x, double d_y) { x = d_x, y = d_y; }
  double operator*(Point obj) { return obj.x * x + obj.y * y; }
  double operator%(Point obj) { return obj.y * x - obj.x * y; }
  Point operator*(double b) {
    Point tmp;
    tmp.x = x * b;
    tmp.y = y * b;
    return tmp;
  }
  Point operator/(double b) {
    Point tmp;
    tmp.x = x / b;
    tmp.y = y / b;
    return tmp;
  }
  Point operator+(Point obj) {
    Point tmp;
    tmp.x = x + obj.x;
    tmp.y = y + obj.y;
    return tmp;
  }
  Point operator-() {
    Point tmp;
    tmp.x = -x;
    tmp.y = -y;
    return tmp;
  }
  Point operator-(Point obj) {
    Point tmp;
    tmp.x = x - obj.x;
    tmp.y = y - obj.y;
    return tmp;
  }
  Point operator-=(Point obj) {
    x -= obj.x;
    y -= obj.y;
    return *this;
  }
  Point operator+=(Point obj) {
    x += obj.x;
    y += obj.y;
    return *this;
  }
  Point operator/=(double b) {
    x = x / b;
    y = y / b;
    return *this;
  }
  Point operator*=(double b) {
    x = x * b;
    y = y * b;
    return *this;
  }
  double size() { return hypot(x, y); }
  Point unit() { return Point(x / size(), y / size()); }
  Point normal() { return Point(y, -x); }
  double atan() { return atan2(y, x); }
};

bool operator<(Point a, Point b) { return a.x != b.x ? a.x < b.x : a.y < b.y; }
bool operator>(Point a, Point b) { return b < a; }
bool operator<=(Point a, Point b) { return !(b < a); }
bool operator>=(Point a, Point b) { return !(a < b); }
bool operator==(Point a, Point b) { return (a - b).size() < eps; }
bool operator!=(Point a, Point b) { return !(a == b); }

bool equal(double a, double b) { return abs(a - b) < eps; }
double cross(Point a, Point b) { return a % b; }
double dot(Point a, Point b) { return a * b; }

int ccw(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  if (b % c > 0)
    return +1;
  else if (b % c < 0)
    return -1;
  else if (b * c < 0)
    return +2;
  else if (b.size() < c.size())
    return -2;
  else
    return 0;
}

ll n;

int main(int argc, char const *argv[]) {
  while (1) {
    cin >> n;
    int ans = 0;
    for (ll i = 1; i * i <= n; i++) {
      if (i * i == n)
        ans++;
      for (int j = i; j * j <= n; j++) {
        if (i * i + j * j == n)
          ans++;
        for (int k = j; k * k <= n; k++) {
          if (i * i + j * j + k * k == n)
            ans++;
          for (int l = k; l * l <= n; l++) {
            if (i * i + j * j + k * k + l * l == n)
              ans++;
          }
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}