Pagini recente » Cod sursa (job #2583782) | Cod sursa (job #1383960) | Cod sursa (job #2677956) | Cod sursa (job #2296260) | Cod sursa (job #3030785)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 5;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct AIB
{
inline int itr(int x)
{
return x & (-x);
}
int len = 0;
vector<int>aib;
AIB(int n)
{
aib.resize(n + 5, 0);
len = n;
}
inline void update(int pos, int val)
{
for(int i = pos; i <= len; i += itr(i))
aib[i] += val;
}
inline int query(int x)
{
int sum = 0;
for(int i = x; i >= 1; i-=itr(i))
sum += aib[i];
return sum;
}
};
int n, m;
AIB aib(NMAX);
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; ++ i)
{
int a;
fin >> a;
aib.update(i, a);
}
while(m--)
{
int tip;
fin >> tip;
if(tip == 0)
{
int a, b;
fin >> a >> b;
aib.update(a, b);
}
if(tip == 1)
{
int a, b;
fin >> a >> b;
fout << aib.query(b) - aib.query(a - 1) << '\n';
}
if(tip == 2)
{
int a;
fin >> a;
int st = 1, dr = n, ans = 0;
while(st <= dr)
{
int mid = (st + dr) / 2;
if(aib.query(mid) >= a)
{
dr = mid - 1;
if(aib.query(mid) == a)
ans = mid;
}
else
st = mid + 1;
}
if(ans)
fout << ans << '\n';
else
fout << -1 << '\n';
}
}
}