Pagini recente » Cod sursa (job #1348337) | Cod sursa (job #893927) | Istoria paginii runda/cel_mai_mare_olimpicar1/clasament | Cod sursa (job #178104) | Cod sursa (job #2127179)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, q;
vector <int> aib;
void Read();
void Update(int pos, int val);
long long Query(int pos);
inline int lsb(int);
int query2(int val);
int main()
{
Read();
fin.close();
fout.close();
return 0;
}
void Read()
{
fin >> n >> q;
aib = vector <int> (n + 1);
int val;
for (int i = 1; i <= n; ++i)
{
fin >> val;
Update(i, val);
}
int op, x, y;
for (int i = 1; i <= q; ++i)
{
fin >> op >> x;
if (op == 0)
{
fin >> y;
Update(x, y);
}
else if (op == 1)
{
fin >> y;
fout << Query(y) - Query(x - 1) << '\n';
}
else
{
fout << query2(x) << '\n';
}
}
}
void Update(int pos, int val)
{
for (int i = pos; i <= n; i += lsb(i))
aib[i] += val;
}
long long Query (int pos)
{
long long s = 0;
for (int i = pos; i >= 1; i -= lsb(i))
s += aib[i];
return s;
}
inline int lsb(int node)
{
return node & -node;
}
int query2(int val)
{
int ans = 0;
int step;
for (step = 1; (step << 1) <= n; step <<= 1);
for (; step; step >>= 1) {
if (ans + step <= n && aib[ans + step] <= val) {
ans += step;
val -= aib[ans];
if (val == 0)
return ans;
}
}
return -1;
}