C# Number Of Disc Intersections
static long NumberOfDiscIntersections(int[] a)
{
    long sum = 0;
    long active = 0;
    var c = a.Length;
    var start = new int[c];
    var end = new int[c];

    for (int k = 0; k < c; k++)
    {
        var v = a[k];
        var startKey = k < v ? 0 : k - v;
        start[startKey]++;

        var endKey = (long)k + v >= c ? c - 1 : k + v;
        end[(int)endKey]++;
    }

    for (int k = 0; k < c; k++)
    {
        sum += active * start[k] + (long)start[k] * (start[k] - 1) / 2;
        active += start[k] - end[k];
        if (sum > 10000000)
        {
            return -1;
        }
    }

    return sum;
}

This sorts disc start and end points and counts active overlaps without comparing every pair directly.