Pagini recente » Cod sursa (job #2371599) | Cod sursa (job #2366553) | Cod sursa (job #3174957) | Cod sursa (job #2780623) | Cod sursa (job #1251116)
#include <fstream>
#define Nmax 100100
using namespace std;
int N;
class Aib {
private:
int Aib[Nmax];
public:
void update(int Node, int Value) {
while(Node <= N) {
Aib[Node] += Value;
Node += (Node & -Node);
}
}
int query(int Node) {
int Sum = 0;
while(Node > 0) {
Sum += Aib[Node];
Node -= (Node & -Node);
}
return Sum;
}
int sum(int A, int B) {
return (query(B) - query(A - 1));
}
int search(int Sum) {
int i, Step;
for(Step = 1; Step < N; Step <<= 1);
for(i = 0; Step; Step >>= 1)
if(i + Step <= N && Aib[i + Step] <= Sum) {
i += Step;
Sum -= Aib[i];
if(Sum == 0)
return i;
}
return -1;
}
} A;
int main() {
int i, a, b, x, type, M;
ifstream in("aib.in");
ofstream out("aib.out");
in >> N >> M;
for(i = 1; i <= N; i++) {
in >> x;
A.update(i, x);
}
while(M--) {
in >> type >> a;
switch(type) {
case 0:
in >> b;
A.update(a, b);
break;
case 1:
in >> b;
out << A.sum(a, b) << '\n';
break;
case 2:
out << A.search(a) << '\n';
}
}
in.close();
out.close();
return 0;
}