Pagini recente » Cod sursa (job #2417396) | Istoria paginii runda/concurs_interesant/clasament | Cod sursa (job #956689) | Cod sursa (job #127294) | Cod sursa (job #3249854)
#include <fstream>
using namespace std;
int n, m, tip, a, b, k, mij;
int bit[100005], v[100005];
int query(int i)
{
int sum = 0;
while(i > 0)
{
sum += bit[i];
i -= (i & -i);
}
return sum;
}
void update(int i, int val)
{
while(i <= n)
{
bit[i] += val;
i += (i & -i);
}
}
int range_query(int l, int r)
{
return query(r) - query(l - 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++)
{
cin >> tip >> a;
if(tip == 0)
{
cin >> b;
update(a, b);
}
else if(tip == 1)
{
cin >> b;
cout << range_query(a, b) << '\n';
}
else
{
int st, dr, mij;
st = 1;
dr = n;
while(dr > st)
{
mij = (st + dr) / 2;
k = query(mij);
if(k >= a)
dr = mij;
else
st = mij + 1;
}
if(query(dr) == a)
cout << dr << '\n';
else
cout << "-1" << '\n';
}
}
return 0;
}