Pagini recente » Cod sursa (job #612343) | Cod sursa (job #2311894) | Cod sursa (job #2789284) | Cod sursa (job #440669) | Cod sursa (job #2422863)
#include <iostream>
#include <fstream>
#define nrz(x) ((x^(x-1))&x)
#define Nmax 100005
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, a, b;
int aib[Nmax];
void update(int pos, int val, int n)
{
while (pos <= n)
{
aib[pos]+=val;
pos+=nrz(pos);
}
}
int query(int pos)
{
int val = 0;
while (pos > 0)
{
val+=aib[pos];
pos-=nrz(pos);
}
return val;
}
int binSearch(int sum, int n)
{
int dr=n, st=1;
while (st <= dr)
{
int md = (st + dr) / 2, k = query(md);
if (k == sum) return md;
else
{
if (k > sum) dr = md - 1;
else st = md + 1;
}
}
return -1;
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f >> a;
update(i, a, n);
}
for (int i = 1; i <= m; i++)
{
f >> a;
if (a == 0)
{
f >> a >> b;
update(a, b, n);
}
else if (a == 1)
{
f >> a >> b;
g << query(b) - query(a-1) << '\n';
}
else
{
f >> a;
g << binSearch(a, n) << '\n';
}
}
return 0;
}