Pagini recente » Cod sursa (job #1577834) | Cod sursa (job #725698) | Cod sursa (job #1298400) | Cod sursa (job #2193896) | Cod sursa (job #1163646)
#include<cstdio>
#include<iostream>
using namespace std;
const int MAX = 100010;
int N, M;
int AIB[MAX];
void OpenFiles() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
}
void CloseFiles() {
fclose(stdin);
fclose(stdout);
}
void Update(int poz, int X) {
for(; poz <= N; poz += (poz & (-poz)))
AIB[poz] += X;
}
int Query(int poz) {
int Ans = 0;
for(; poz; poz -= (poz & (-poz)))
Ans += AIB[poz];
return Ans;
}
int main() {
OpenFiles();
cin >> N >> M;
for(int i = 1, A; i <= N; i++) {
cin >> A;
Update(i, A);
}
int step = 1;
for(step = 1; step <= N; step <<= 1);
step >>= 1;
for(int i = 1, op, A, B; i <= M; i++) {
cin >> op;
switch(op) {
case 0:
cin >> A >> B;
Update(A, B);
break;
case 1:
cin >> A >> B;
cout << Query(B) - Query(A - 1) << "\n";
break;
case 2:
int Ans = 0, X = 0, target;
cin >> target;
for(int i = step; i; i >>= 1) {
if(i + Ans > N) continue;
if(X + AIB[Ans + i] <= target) {
Ans += i;
X += AIB[Ans];
}
}
if(X == target)
cout << Ans << "\n";
else
cout << "-1\n";
}
}
CloseFiles();
}