Pagini recente » Cod sursa (job #1295387) | Cod sursa (job #3256147) | Cod sursa (job #2138189) | Cod sursa (job #1696363) | Cod sursa (job #2890372)
#include <fstream>
#define lsb(x) x & (-x)
using namespace std;
ifstream cin ("aib.in");
ofstream cout ("aib.out");
const int N = 1e5 + 2;
int aib[N];
int n, q, x;
void update (int pos, int val)
{
for (int i = pos; i <= n; i += lsb(i))
aib[i] += val;
}
int query (int pos)
{
int s = 0;
for (int i = pos; i >= 1; i -= lsb(i))
s += aib[i];
return s;
}
struct cerin
{
short int c;
int st, dr;
} o;
int bs (int st, int dr, int val)
{
int mid, last = -1;
while (st <= dr)
{
mid = (st + dr) >> 1;
if (query(mid) >= val)
{
last = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
return last;
}
int main()
{
cin >> n >> q;
for (int i = 1; i <= n; ++i)
cin >> x, update (i, x);
for (int i = 1; i <= q; ++i)
{
cin >> o.c >> o.st;
if (!o.c)
{
cin >> o.dr;
update (o.st, o.dr);
}
else if (o.c == 1)
{
cin >> o.dr;
cout << query (o.dr) - query (o.st - 1) << '\n';
}
else
{
cout << bs (1, n, o.st) << '\n';
}
}
return 0;
}