Pagini recente » Cod sursa (job #1077819) | Cod sursa (job #1175782) | Cod sursa (job #2894071) | Cod sursa (job #2297709) | Cod sursa (job #1509445)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
vector <int> aib;
int n, m;
int q, a, b;
void update(int i, int ad)
{
for(; i <= n; i += i&(-i)) aib[i] += ad;
}
int query(int i)
{
int ans = 0;
for(; i > 0; i -= i&(-i)) ans += aib[i];
return ans;
}
int getFirst(int sum)
{
int l, r, q, m;
l = 1;
r = n;
while(l <= r)
{
m = (l+r) >> 1;
q = query(m);
if(sum == q)
{
return m;
}
if(q < sum) l = m+1;
else r = m-1;
}
return -1;
}
int main()
{
cin >> n >> m;
aib.resize(n+1, 0);
for(int i = 1; i <= n; i++)
{
cin >> q;
update(i, q);
}
for(int i = 0; i < m; i++)
{
cin >> q;
if(q == 0)
{
cin >> a >> b;
update(a, b);
}
else if(q == 1)
{
cin >> a >> b;
cout << query(b) - query(a-1) << "\n";
}
else
{
cin >> a;
cout << getFirst(a) << "\n";
}
}
return 0;
}