Pagini recente » Cod sursa (job #2440205) | Cod sursa (job #453680) | Cod sursa (job #2640761) | Cod sursa (job #1041007) | Cod sursa (job #2346070)
#include <fstream>
#include <cmath>
#include <iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMax = 1e5;
int N, M, AIB[NMax + 5], Log2[NMax + 5], K;
void Update(int P, int V)
{
for(int i = P; i <= N; i += (i & (-i)))
AIB[i] += V;
}
int Sum(int P)
{
int Sol = 0;
for(int i = P; i > 0; i -= (i & (-i)))
Sol += AIB[i];
return Sol;
}
int Search(int A)
{
int P = 0;
for(int k = (1 << K); k > 0; k >>= 1)
if(P + k <= N && Sum(P + k) < A)
P += k;
return ((Sum(P + 1) == A) ? P + 1 : -1);
}
int main()
{
fin >> N >> M;
for(int i = 1, x; i <= N; i++)
fin >> x, Update(i, x);
K = log2(N);
for(int i = 0, p, a, b; i < M; i++)
{
fin >> p >> a;
if(p == 0)
fin >> b, Update(a, b);
if(p == 1)
fin >> b, fout << Sum(b) - Sum(a - 1) << '\n';
if(p == 2)
fout << Search(a) << '\n';
}
fin.close();
fout.close();
return 0;
}