Pagini recente » Cod sursa (job #52643) | Cod sursa (job #1443239) | Cod sursa (job #2931892) | Cod sursa (job #1381254) | Cod sursa (job #1163650)
#include<cstdio>
#include<fstream>
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();
ifstream in("aib.in"); ofstream out("aib.out");
in >> N >> M;
for(int i = 1, A; i <= N; i++) {
in >> 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++) {
in >> op;
switch(op) {
case 0:
in >> A >> B;
Update(A, B);
break;
case 1:
in >> A >> B;
out << Query(B) - Query(A - 1) << "\n";
break;
case 2:
int Ans = 0, X = 0, target;
in >> 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)
out << Ans << "\n";
else
out << "-1\n";
break;
}
}
//CloseFiles();
}