Pagini recente » Cod sursa (job #2227687) | Cod sursa (job #1538902) | Cod sursa (job #2896143) | Cod sursa (job #1100449) | Cod sursa (job #3267055)
#include <iostream>
using namespace std;
int aint[400005];
int n, m;
int p, x, a, b, c;
void create(int nod, int st, int dr) {
if (st == dr) {
cin >> aint[nod];
return;
}
int mij = (st + dr) / 2;
create(2*nod, st, mij);
create(2*nod+1, mij+1, dr);
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
void update(int nod, int st, int dr) {
if (p < st || p > dr) {
return;
}
if (st == dr) {
aint[nod] += x;
return;
}
int mij = (st + dr) / 2;
update(2*nod, st, mij);
update(2*nod+1, mij+1, dr);
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
int query(int nod, int st, int dr) {
if (b < st || a > dr) {
return 0;
}
if (a <= st && dr <= b) {
return aint[nod];
}
int mij = (st + dr) / 2;
return query(2*nod, st, mij) + query(2*nod+1, mij+1, dr);
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin >> n >> m;
create(1, 1, n);
for (;m;m--) {
cin >> c;
if (c == 0) {
cin >> p >> x;
update(1, 1, n);
}
else if (c == 1) {
cin >> a >> b;
cout << query(1, 1, n) << '\n';
}
else {
cin >> x;
int st = 1, dr = n;
while (st != dr) {
int mij = (st + dr) / 2;
a = 1; b = mij;
if (query(1, 1, n) >= x) {
dr = mij;
}
else {
st = mij + 1;
}
}
a = 1; b = st;
if (query(1, 1, n) == x) {
cout << st << '\n';
}
else cout << -1 << '\n';
}
}
return 0;
}