Pagini recente » Cod sursa (job #1915313) | Cod sursa (job #1262812) | Cod sursa (job #2908684) | Cod sursa (job #48408) | Cod sursa (job #2809316)
#include <fstream>
#define ub(x) (x & (-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, i, c, x, a, b, aib[100010];
void Add(int x, int val)
{
for (int i = x; i <= n; i += ub(i))
aib[i] += val;
}
int Suma(int x)
{
int sum = 0;
for (int i = x; i >= 1; i -= ub(i))
sum += aib[i];
return sum;
}
int Cauta(int x)
{
int st = 1, dr = n, poz = 0;
while (st <= dr)
{
int m = (st + dr) / 2;
int val = Suma(m);
if (val >= x)
poz = m, dr = m - 1;
else
st = m + 1;
}
if (Suma(poz) == x)
return poz;
return -1;
}
int main()
{
ios::sync_with_stdio(false);
f.tie(0), g.tie(0);
f >> n >> m;
for (i = 1; i <= n; ++i)
{
f >> x;
Add(i, x);
}
for (i = 1; i <= m; ++i)
{
f >> c;
if (c == 0)
{
f >> a >> b;
Add(a, b);
}
else
if (c == 1)
{
f >> a >> b;
g << Suma(b) - Suma(a - 1) << '\n';
}
else
if (c == 2)
{
f >> a;
g << Cauta(a) << '\n';
}
}
return 0;
}