Pagini recente » Cod sursa (job #1443414) | Cod sursa (job #1433419) | carnedecal+hendoreanu | Cod sursa (job #2072864) | Cod sursa (job #2487660)
#include<fstream>
#include<cmath>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMax = 100000;
int N, M, AIB[NMax+5], K;
void Update(int X, int V) {
for(int i = X; i <= N; i += (i&(-i)))
AIB[i] += V;
}
int Query(int X) {
int S = 0;
for (int i = X; i > 0; i -= (i&(-i)))
S += AIB[i];
return S;
}
int Search(int V) {
int Step = 0;
for(int k = (1 << K); k > 0; k >>= 1)
if(Step + k <= N && Query(Step + k) < V)
Step += k;
return ((Query(Step + 1) == V) ? Step + 1 : -1);
}
int main() {
in >> N >> M;
for (int i = 1,x; i <= N; i++) {
in >> x;
Update(i,x);
}
K = log2(N);
while(M--) {
int Type,x,y;
in >> Type >> x;
if(Type == 0) {
in >> y;
Update(x,y);
}
if(Type == 1) {
in >> y;
out << Query(y) - Query(x-1) << '\n';
}
if(Type == 2) {
out << Search(x) << '\n';
}
}
return 0;
}