Pagini recente » Cod sursa (job #230946) | Cod sursa (job #2969656) | Cod sursa (job #83558) | Cod sursa (job #3039749) | Cod sursa (job #2172952)
#include <fstream>
using namespace std;
const int DIM = 100010;
int n, q;
int v[DIM], aib[DIM];
inline int lsb(const 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 ret = 0;
for (int i = pos;i >= 1;i -= lsb(i))
ret += aib[i];
return ret;
}
int BinarySearch(int val)
{
int left = 1, right = n, mid, p = -1, aux;
while (left <= right)
{
mid = (left + right) / 2;
aux = Query(mid);
if (aux == val)
{
p = mid;
right = mid - 1;
}
else if (aux < val)
left = mid + 1;
else
right = mid - 1;
}
return p;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> n >> q;
int op, x, y;
for (int i = 1;i <= n;++i)
{
fin >> x;
Update(i, x);
}
for (int i = 1;i <= q;++i)
{
fin >> op;
if (op == 0)
{
fin >> x >> y;
Update(x, y);
}
else if (op == 1)
{
fin >> x >> y;
fout << Query(y) - Query(x - 1) << "\n";
}
else
{
fin >> x;
fout << BinarySearch(x) << "\n";
}
}
fin.close();
fout.close();
return 0;
}