Pagini recente » Cod sursa (job #247124) | Cod sursa (job #1143372) | Cod sursa (job #2287296) | Cod sursa (job #1867449) | Cod sursa (job #3197744)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
const int MAX_N = 1e5 + 1;
int n, aib[MAX_N], a[MAX_N], s[MAX_N], m;
void update(int indice, int val)
{
int lsb = 0;
while (indice <= n)
{
aib[indice] += val;
indice += (indice & -indice);
}
}
int query(int indice)
{
int ans = 0;
while (indice)
{
int lsb = (indice & -indice);
ans += aib[indice];
indice -= lsb;
}
return ans;
}
int main()
{
int i, c, ind, val, x, y;
cin >> n >> m;
for (i = 1; i <= n; i++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
int lsb = (i & -i);
aib[i] = s[i] - s[i - lsb];
}
for (i = 0; i < m; i++)
{
cin >> c;
if (c == 0)
{
cin >> ind >> val;
update(ind, val);
a[ind] += val;
}
if (c == 1)
{
cin >> x >> y;
cout << query(y) - query(x - 1) << '\n';
}
if (c == 2)
{
cin >> val;
int st = 1, dr = n, poz = -1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (query(mij) < val)
{
st = mij + 1;
}
else { dr = mij - 1;if (query(mij) == val) poz = mij; }
}
cout << poz << '\n';
}
}
}