Pagini recente » Cod sursa (job #2882369) | Cod sursa (job #244725) | Cod sursa (job #2947705) | Cod sursa (job #228765) | Cod sursa (job #3267056)
#include <iostream>
using namespace std;
int aint[400005];
int n, m;
int p, x, a, b, c;
int res;
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];
}
void query(int nod, int st, int dr) {
if (b < st || a > dr) {
return;
}
if (a <= st && dr <= b) {
res += aint[nod];
return;
}
int mij = (st + dr) / 2;
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;
res = 0;
query(1, 1, n);
cout << res << '\n';
}
else {
cin >> x;
int st = 1, dr = n;
while (st != dr) {
int mij = (st + dr) / 2;
a = 1; b = mij; res = 0;
query(1, 1, n);
if (res >= x) {
dr = mij;
}
else {
st = mij + 1;
}
}
a = 1; b = st; res = 0;
query(1, 1, n);
if (res == x) {
cout << st << '\n';
}
else cout << -1 << '\n';
}
}
return 0;
}