Pagini recente » Cod sursa (job #2398906) | Cod sursa (job #1490509) | Cod sursa (job #2740580) | Cod sursa (job #1430995) | Cod sursa (job #2891198)
#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define io \
ios_base::sync_with_stdio(false); \
cin.tie(NULL); \
cout.tie(NULL)
#define all(x) begin(x), end(x)
using ld = long double;
using ll = long long;
using ull = unsigned long long;
#pragma endregion Template
#pragma region Debug
#define sim template <class c
#define ris return *this
#define dor > debug& operator<<
#define eni(x) sim > typename enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef HOME
~debug() { /*cerr << endl;*/
}
eni(!= ) cerr << boolalpha << i;
ris;
} eni(== ) ris << range(begin(i), end(i));
}
sim, class b dor(pair<b, c> d) {
ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
*this << "[";
for (auto it = d.b; it != d.e; ++it)
*this << ", " + 2 * (it == d.b) << *it;
ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
}
;
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
#define dbg(x) \
debug() << imie(x); \
cerr << endl
#define drg(x, n) \
debug() << " [" << #x ": " << range(x, x + n) << "] "; \
cerr << endl
#define darr(x) \
debug() << " [" << #x ": " << range(all(x)) << "] "; \
cerr << endl
#define darr2D(x) \
size_t step = 0; \
cerr << " [" << #x ": ["; \
for_each(all(x), [&step](const auto& it) { debug() << range(all(it)); if(step < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step; }); \
cerr << "]] " << endl
#define TwoD(x) \
size_t step = 0; \
cerr << "["; \
for_each(all(x), [&step](const auto& it) { debug() << range(all(it)); if(step < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step; }); \
cerr << "]"
#define darr3D(x) \
size_t step1 = 0; \
cerr << " [" << #x ": ["; \
for_each(all(x), [&step1](const auto& it1) { TwoD(it1); if(step1 < sizeof(x) / sizeof(x[0])-1) cerr << ", "; ++step1; }); \
cerr << "]] " << endl
#pragma endregion Debug
vector<ll> build(vector<ll> v) {
vector<ll> bit = v;
for (int i = 0; i < (int)v.size(); i++) {
int parent = i + (i & (-i));
if (parent < (int)v.size()) {
bit[parent] += bit[i];
}
}
return bit;
}
ll sum(vector<ll>& bit, ll idx) {
ll sum = 0;
for (int i = idx; i; i -= (i & (-i)))
sum += bit[i];
return sum;
}
ll sum(vector<ll>& bit, ll L, ll R) { return sum(bit, R) - sum(bit, L - 1); }
void update(vector<ll>& bit, ll idx, ll val) {
for (int i = idx; i <= (int)bit.size(); i += (i & (-i)))
bit[i] += val;
}
int search(vector<ll>& bit, ll target) {
int l = 1;
int r = bit.size() - 1;
int ans = -1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (sum(bit, mid) == target) {
ans = mid;
return ans;
}
else if (sum(bit, mid) > target) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
return ans;
}
int n;
int q;
int main() {
io;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin >> n >> q;
vector<ll> v(n + 1);
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
vector<ll> bit = build(v);
while (q--) {
int type;
cin >> type;
if (type == 0) {
ll index, value;
cin >> index >> value;
update(bit, index, value);
}
if (type == 1) {
int L, R;
cin >> L >> R;
cout << sum(bit, L, R) << '\n';
}
if (type == 2) {
int target;
cin >> target;
cout << search(bit, target) << '\n';
}
}
return 0;
}