Pagini recente » Cod sursa (job #1382335) | Cod sursa (job #1774486) | Cod sursa (job #1482842) | Cod sursa (job #864693) | Cod sursa (job #3342317)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
#if 1
#define int ll
#define uint ull
#endif
/**
* Problem: Cuburi2
* URL: https://www.infoarena.ro/problema/cuburi2
* TL: 375 ms
* ML: 20 MB
*
* Good Luck!
*/
void preinit() {
}
void tc() {
int n, m;
cin >> n >> m;
vector<int> h(n + 1), prefW(n + 1), prefIW(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> h[i];
prefW[i] = prefW[i - 1] + h[i];
prefIW[i] = prefIW[i - 1] + 1LL * i * h[i];
}
auto rangeW = [&](int l, int r) -> int {
if (l > r) return 0;
return prefW[r] - prefW[l - 1];
};
auto rangeIW = [&](int l, int r) -> int {
if (l > r) return 0;
return prefIW[r] - prefIW[l - 1];
};
while (m--) {
int l, r;
cin >> l >> r;
int total = rangeW(l, r);
int need = total / 2 + 1;
int target = prefW[l - 1] + need;
int p =
int(lower_bound(prefW.begin() + l, prefW.begin() + r + 1, target) -
prefW.begin());
int leftW = rangeW(l, p - 1);
int leftIW = rangeIW(l, p - 1);
int rightW = rangeW(p + 1, r);
int rightIW = rangeIW(p + 1, r);
int cost = 1LL * p * leftW - leftIW + rightIW - 1LL * p * rightW;
cout << p << ' ' << cost << '\n';
}
}
#define MTC 0
#define FIO 0
#define FN ""
signed main() {
#if FIO == 1 && !defined(LOCAL)
(void)freopen(FN ".in", "r", stdin);
(void)freopen(FN ".out", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
preinit();
#if MTC == 1
signed tt;
cin >> tt;
while (tt--) tc();
#else
tc();
#endif
return 0;
}