Pagini recente » Cod sursa (job #2689406) | Cod sursa (job #2136311) | Cod sursa (job #2094532) | Cod sursa (job #1466146) | Cod sursa (job #3273785)
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
const int Nmax = 100005;
int n, m, x, y, c;
vector<int> aib;
void update(int node, int val)
{
for(; node <= n; node += node&(-node))
aib[node] += val;
}
int query(int node)
{
int ans = 0;
for(; node > 0; node -= node&(-node))
ans += aib[node];
return ans;
}
int bs(int val)
{
int ans = 0, csum = 0;
for(int step = (1 << 30); step > 0; step /= 2)
if(ans + step <= n && csum + aib[ans + step] < val)
{
ans += step;
csum += aib[ans];
}
if(ans + 1 > n || query(ans + 1) != val)
return -1;
return ans + 1;
}
int main()
{
cin >> n >> m;
aib.resize(n+1);
for(int i=1; i<=n; i++)
{
cin >> x;
update(i, x);
}
while(m--)
{
cin >> c;
if(c == 0)
{
cin >> x >> y;
update(x, y);
}
else
if(c == 1)
{
cin >> x >> y;
cout << query(y) - query(x - 1) << '\n';
}
else
{
cin >> x;
cout << bs(x) << '\n';
}
}
return 0;
}