Pagini recente » Cod sursa (job #624830) | Cod sursa (job #1687897) | Cod sursa (job #2851593) | Cod sursa (job #885254) | Cod sursa (job #2372133)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
class AIB
{
public:
vector <int> m_aib;
int m_size;
void update(int loc, int val)
{
for(;loc < m_size; loc += loc & (-loc))
m_aib[loc] += val;
}
int query(int loc)
{
int ans = 0;
for(;loc > 0; loc -= loc & (-loc))
ans += m_aib[loc];
return ans;
}
int query_int(int l, int r)
{
return query(r) - query(l - 1);
}
int get_pos(int val)
{
int i = 0, j = 1 << (31 - __builtin_clz(m_size));
for(;j > 0; j >>= 1)
{
if(i + j <= m_size)
{
if(val >= m_aib[i + j])
{
i += j;
val -= m_aib[i];
if(val == 0)
{
return i;
}
}
}
}
return -1;
}
AIB(int n, vector <int> &v)
{
m_aib = vector <int> (n + 1, 0);
m_size = n + 1;
for(int i = 0; i < n; i++)
update(i + 1, v[i]);
}
};
int main()
{
int n, q;
fin>>n>>q;
vector <int> v(n);
for(int i = 0; i < n; i++)
fin>>v[i];
AIB aib(n, v);
int c, a, b;
for(; q; q--)
{
fin>>c;
switch(c)
{
case 0:
fin>>a>>b;
aib.update(a, b);
break;
case 1:
fin>>a>>b;
fout<<aib.query_int(a, b)<<'\n';
break;
case 2:
fin>>a;
fout<<aib.get_pos(a)<<'\n';
}
}
return 0;
}