Pagini recente » Cod sursa (job #2539955) | Cod sursa (job #675334) | Cod sursa (job #498027) | Cod sursa (job #2207696) | Cod sursa (job #2113534)
#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 >= 0; i--)
{
if(v[p + (1 << i)] <= val)
{
rez += (1 << i);
p += (1 << i);
val -= v[p];
}
}
if(val == 0)
return rez;
else
return -1;
}
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;
}