Pagini recente » Cod sursa (job #1571152) | Cod sursa (job #2145121) | Cod sursa (job #2477660) | Cod sursa (job #1119205) | Cod sursa (job #2119006)
#include <iostream>
#include <fstream>
using namespace std;
int n, v[100002], k;
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 p = 0, i = 0;
for(;(1 << i) <= n; i++);
for(; val > 0 && i >= 0; i--)
{
if(p + (1 << i) <= n && v[p + (1 << i)] <= val)
{
p += (1 << i);
val -= v[p];
}
if(val == 0)
return p;
}
return -1;
}
int main()
{
ifstream fin ("aib.in");
ofstream fout ("aib.out");
fin >> n >> k;
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;
}