Pagini recente » Cod sursa (job #1629571) | Cod sursa (job #1322747) | Cod sursa (job #1675376) | Cod sursa (job #3237016) | Cod sursa (job #1925203)
#include <fstream>
using namespace std;
#define MAXN 100001
#define lsb(x) ((x) & (-x))
ifstream f{ "aib.in" };
ofstream q{ "aib.out" };
int n, m;
int aib[MAXN];
int sum(int idx)
{
int sum = 0;
for (; idx > 0; idx -= lsb(idx)) sum += aib[idx];
return sum;
}
void update(int idx, int val)
{
for (; idx <= n; idx += lsb(idx)) aib[idx] += val;
}
int query(int a, int b)
{
return sum(b) - sum(a - 1);
}
int find(int a)
{
int idx;
for (idx = 1; idx <= n; idx <<= 1);
for(int i = 0; idx; idx >>=1)
{
if(i + idx <= n && a >= aib[i + idx])
{
i += idx;
a -= aib[i];
}
if (a == 0) return i;
}
return -1;
}
int main()
{
f >> n >> m;
int x, op, a, b;
for (int i = 1; i <= n; ++i) f >> x, update(i, x);
while(m--)
{
f >> op;
if (op == 0)
{
f >> a >> b;
update(a, b);
}
else if (op == 1)
{
f >> a >> b;
q << query(a, b) << "\n";
}
else
{
f >> a;
q << find(a) << "\n";
}
}
f.close();
q.close();
return 0;
}