https://csacademy.com/contest/round-47/task/consecutive-sum/
解法
[L,R]のRの地点を全探索する。
「sm=[0,i]の総和」と「v={0, [0,0]の総和, [0,1]の総和, [0,2]の総和, …}」を作りながら、[?,i]を順に探索する。
各iについて、v上の二分探索を使って、[0,i]-[0,x]=Dとなるxを求める。
そのようなxがあれば、それから答えを出す。
全て探索して、無ければ-1
typedef long long ll; int N; //--------------------------------------------------------------------------------------------------- pair<int, int> solve() { vector<ll> v; v.push_back(0); ll sm = 0; rep(i, 1, 101010) { sm += i; ll d = sm - N; auto ite = lower_bound(v.begin(), v.end(), d); if (ite == v.end()) continue; if (*ite == d && ite - v.begin() + 1 != i) return { ite - v.begin() + 1, i }; v.push_back(sm); } return { -1, -1 }; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> N; auto ans = solve(); if (ans.first < 0) printf("-1\n"); else printf("%d %d\n", ans.first, ans.second); }