import std.algorithm; import std.array; import std.conv; import std.math; import std.range; import std.stdio; import std.string; import std.typecons; T read(T)() { return readln.chomp.to!T; } T[] reads(T)() { return readln.split.to!(T[]); } alias readint = read!int; alias readints = reads!int; int calc(int a, int b, int c) { assert(a <= b && b <= c); bool canMake(int n) { int surplus = max(0, c - n)/2 + max(0, b - n)/2 + max(0, a - n)/2; int shortage = max(0, n - c) + max(0, n - b) + max(0, n - a); return surplus >= shortage; } int ans = 0; int lo = 0; int hi = c; while (lo <= hi) { int m = (lo + hi) / 2; if (canMake(m)) { ans = max(ans, m); lo = m + 1; } else { hi = m - 1; } } return ans; } void main() { auto rgb = readints; rgb.sort; auto ans = calc(rgb[0], rgb[1], rgb[2]); writeln(ans); }