Pagini recente » Cod sursa (job #2763768) | Cod sursa (job #1715754) | Cod sursa (job #3335267) | Cod sursa (job #2302880) | Cod sursa (job #2808114)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int aib[100001];
int n, m;
void update (int place, int val)
{
for (int i = place; i<=n;i += i & (-i))
aib[i] += val;
}
int qr (int place)
{
int ans = 0;
for (int i = place; i>0; i -= (i&-i))
ans += aib[i];
return ans;
}
int caut_bin (int value)
{
int st = 1, dr = n, poz = -1;
while (st <= dr)
{
int mid = (st + dr) / 2;
int val = qr(mid);
if (val == value)
{
poz = mid;
dr = mid - 1;
}
else if (val < value)
st = mid + 1;
else
dr = mid - 1;
}
return poz;
}
int main()
{
in >> n >> m;
for (int i = 1;i<=n;++i)
{
int val;
in >> val;
update (i, val);
}
while (m--)
{
int type;
in >> type;
if (type == 0)
{
int place, value;
in >> place >> value;
update (place, value);
}
else if (type == 1)
{
int st, dr;
in >> st >> dr;
out << qr(dr) - qr(st - 1) << '\n';
}
else
{
int val;
in >> val;
out << caut_bin (val) << '\n';
}
}
return 0;
}