Pagini recente » Cod sursa (job #792598) | Cod sursa (job #853970) | Cod sursa (job #2570874) | Cod sursa (job #734997) | Cod sursa (job #2295050)
#include <bits/stdc++.h>
using namespace std;
class AIB
{
// variables
public:
private:
int m_size;
vector <int> m_aib;
// functions
public:
void update(int poz, int val)
{
for(; poz < m_size; poz += poz & (-poz))
{
m_aib[poz] += val;
}
}
int getSum(int poz)
{
int sum = 0;
for(; poz > 0; poz -= poz & (-poz))
{
sum += m_aib[poz];
}
return sum;
}
int getInterval(int i, int j)
{
return getSum(j) - getSum(i - 1);
}
int searchIndex(int sum)
{
int i = 0, j = 1 << (31 - __builtin_clz(m_size - 1));
for(; j > 0; j >>= 1)
{
if(i + j < m_size)
{
if(sum >= m_aib[i + j])
{
i += j;
sum -= m_aib[i];
if(sum == 0)
{
return i;
}
}
}
}
return -1;
}
void initialize(vector <int> &values)
{
m_size = values.size();
m_aib.reserve(m_size);
for(int i = 1; i < m_size; i++)
update(i, values[i]);
}
AIB()
{}
AIB(vector <int> &values)
{
initialize(values);
}
private:
};
ifstream fin("aib.in");
ofstream fout("aib.out");
int main()
{
int n, m;
fin>>n>>m;
vector <int> v(n+1);
for(int i = 1; i <= n; i++)
fin>>v[i];
AIB aib(v);
int op,a,b;
for(; m; m--)
{
fin>>op;
switch(op)
{
case 0:
fin>>a>>b;
aib.update(a, b);
break;
case 1:
fin>>a>>b;
fout<<aib.getInterval(a, b)<<'\n';
break;
case 2:
fin>>a;
fout<<aib.searchIndex(a)<<'\n';
break;
default:
break;
}
}
return 0;
}