Pagini recente » Cod sursa (job #1781957) | Cod sursa (job #789699) | Cod sursa (job #1954108) | Cod sursa (job #2915990) | Cod sursa (job #2253026)
#include <iostream>
#include <fstream>
using namespace std;
const int maxn = 1e5+5;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, i, x, y, z;
class aib
{
private:
int v[maxn];
public:
void update(int pos, int val)
{
v[pos] += val;
if(pos <= n && (pos+(pos & (-pos)) <= n) ) {
update(pos+(pos & (-pos)), val);
}
}
int query(int a, int b)
{
if(a != 1) {
return query(1, b) - query(1, a-1);
}
//log
int log, i, left = 0, sum = 0;
for(i = 0; (1 << i) < n; i ++) {}
log = (1 << (i));
if(log > n)
log >>= 1;
while(log > 0)
{
if(b == left + log) {
return sum + v[b];
}
if(b > left + log) {
sum += v[left + log];
left += log;
}
log >>= 1;
}
}
int bsq(int a)
{
//log
int log, i, left = 0, sum = 0;
for(i = 0; (1 << i) < n; i ++) {}
log = (1 << (i));
if(log > n)
log >>= 1;
while(log > 0)
{
if(!(left + log <= n)) {
log >>= 1;
continue;
}
if(a == sum + v[left + log]) {
return left + log;
}
if(a > sum + v[left + log]) {
sum += v[left + log];
left += log;
}
log >>= 1;
}
return -1;
}
}a;
int main()
{
f >> n >> m;
for(i = 1; i <= n; i ++)
{
f >> x;
a.update(i, x);
}
while(m--)
{
f >> x;
if(x == 0 || x == 1)
{
f >> y >> z;
if(x == 0) {
a.update(y, z);
}
else {
g << a.query(y, z) << '\n';
}
} else {
f >> y;
g << a.bsq(y) << '\n';
}
}
f.close();
g.close();
return 0;
}