Pagini recente » Cod sursa (job #2857313) | Cod sursa (job #2805518) | Cod sursa (job #585003) | Cod sursa (job #804868) | Cod sursa (job #2875809)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int aib[100005];
void update(int p, int x, int n)
{
for(int i = p; i <= n; i += (i&(-i)))
aib[i] += x;
}
int sum (int p)
{
int ans = 0;
for(int i = p; i >= 1; i -= (i&(-i)))
ans += aib[i];
return ans;
}
int binar (int x, int n)
{
int a = 1, b = n, ans = 1;
while(a <= b)
{
int k = (a + b) / 2;
if(sum(k) <= x)
{
a = k + 1;
ans = k;
}
if(sum(k) > x)
b = k - 1;
}
if(sum(ans) == x)
return ans;
else
return -1;
}
int main()
{
int n, m, x, c, a, b;
in >> n >> m;
for(int i = 1; i <= n; i ++)
{
in >> x;
update(i, x, n);
}
for(int i = 1; i <= m; i++)
{
in >> c;
if(c == 0)
{
in >> a >> b;
update(a, b, n);
}
else if(c == 1)
{
in >> a >> b;
out << sum(b) - sum(a - 1) << '\n';
}
else
{
in >> x;
out << binar(x, n) << '\n';
}
}
return 0;
}