Pagini recente » Cod sursa (job #2161934) | Cod sursa (job #3003767) | Cod sursa (job #2861505) | Cod sursa (job #2939022) | Cod sursa (job #2641511)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
int N, M;
int aib[NMAX];
int lsb(int x)
{
return (x & (-x));
}
void Update(int pos, int val)
{
for (int i = pos;i <= N;i += lsb(i))
aib[i] += val;
}
int Query(int pos)
{
int sum = 0;
for (int i = pos;i >= 1;i -= lsb(i))
sum += aib[i];
return sum;
}
int BinarySearch(int a)
{
int left = 1, right = N, pos = -1, mid;
while (left <= right)
{
mid = (left + right) / 2;
if (Query(mid) >= a)
{
pos = mid;
right = mid - 1;
}
else
left = mid + 1;
}
if (pos != -1 && Query(pos) != a)
pos = -1;
return pos;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> N >> M;
for (int i = 1;i <= N;++i)
{
int x;
fin >> x;
Update(i, x);
}
for (int i = 1;i <= M;++i)
{
int op;
fin >> op;
if (op == 0)
{
int a, b;
fin >> a >> b;
Update(a, b);
}
else if (op == 1)
{
int a, b;
fin >> a >> b;
fout << Query(b) - Query(a - 1) << "\n";
}
else
{
int a;
fin >> a;
fout << BinarySearch(a) << "\n";
}
}
fin.close();
fout.close();
return 0;
}