Pagini recente » Cod sursa (job #1552217) | Cod sursa (job #2552641) | Cod sursa (job #860116) | Cod sursa (job #1850247) | Cod sursa (job #2113527)
#include <iostream>
#include <fstream>
using namespace std;
int n, v[100002], k, bbn;
int bb (int n)
{
int i;
for(i = 0; (1 << i) <= n; i++);
return i - 1;
}
int lsb (int n)
{
return n & (n - 1) ^ n;
}
void update (int p, int val)
{
for(int j = p; j <= n; j += lsb(j))
{
v[j] += val;
}
}
int query (int p)
{
int s = 0;
for(int j = p; j > 0; j -= lsb(j))
{
s += v[j];
}
return s;
}
int query2 (int val)
{
int rez = 0, p = 0;
for(int i = bbn; val > 0; i--)
{
if(v[p + (1 << i)] <= val)
{
rez += (1 << i);
p += (1 << i);
val -= v[p];
}
}
return rez;
}
int main()
{
ifstream fin ("aib.in");
ofstream fout ("aib.out");
fin >> n >> k;
bbn = bb(n);
for(int i = 1; i <= n; i++)
{
int e;
fin >> e;
update(i, e);
}
for(int i = 1; i <= k; i++)
{
int o, a, b;
fin >> o;
if(o == 0)
{
fin >> a >> b;
update(a, b);
}
else if(o == 1)
{
fin >> a >> b;
fout << query(b) - query(a - 1) << "\n";
}
else
{
fin >> a;
fout << query2(a) << "\n";
}
}
return 0;
}