Pagini recente » Cod sursa (job #125216) | Cod sursa (job #3142372) | Cod sursa (job #1463912) | Cod sursa (job #869648) | Cod sursa (job #2725655)
#include<bits/stdc++.h>
using namespace std;
int n, m, v[100002], fenwick[100002];
void update(int node, int value)
{
for(int i = node; i <= n; i += (i & (-i)))
fenwick[i] += value;
}
int compute(int node)
{
int ans = 0;
for(int i = node; i > 0; i -= (i & (-i)))
ans += fenwick[i];
return ans;
}
int bin_search(int sum)
{
int L = 1;
int R = n;
int ans = 0;
while(L <= R)
{
int mid = (L + R) / 2;
if(compute(mid) >= sum)
{
R = mid - 1;
if(compute(mid) == sum)
ans = mid;
}
else
L = mid + 1;
}
if(ans == 0)
return -1;
return ans;
}
int optimized(int sum)
{
int ans = 0;
int poz = 0;
int stp = 1;
while(stp * 2 <= n)
stp *= 2;
int org_sum = sum;
while(stp)
{
if(poz + stp <= n && sum > fenwick[poz+stp])
sum -= fenwick[poz+stp], poz += stp;
stp >>= 1;
}
int sm = compute(poz+1);
if(sm != org_sum)
return -1;
return poz+1;
}
int main()
{
ifstream cin("aib.in");
ofstream cout("aib.out");
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; ++i)
{
int type;
cin >> type;
if(type == 0)
{
int a, b;
cin >> a >> b;
update(a, b);
}
if(type == 1)
{
int a, b;
cin >> a >> b;
cout << compute(b) - compute(a-1) << '\n';
}
if(type == 2)
{
int sum;
cin >> sum;
// cout << bin_search(sum) << '\n';
cout << optimized(sum) << '\n';
}
}
return 0;
}