Cod sursa(job #754583)
#include<fstream>
#include<algorithm>
#define pow_zr(x) ((x^(x-1))&x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100001], val, n, m, op, poz, cst, cdr, k, x;
//Adaugare
void Update(int ind, int val)
{
for ( int j = ind; j <= n; j += pow_zr(j) )
{
aib[j] += val;
}
}
//Suma
int Sum(int ind)
{
int sum = 0;
for ( int j = ind; j > 0; j -= pow_zr(j) )
{
sum += aib[j];
}
return sum;
}
//Cautare
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= aib[i+step] )
{
i += step, val -= aib[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main()
{
int i;
fin >> n >> m;
for ( i = 1; i <= n; i++ )
{
fin >> val;
Update(i,val);
}
for( i = 1; i <= m; i++ )
{
fin >> op;
if ( op == 0 )
{
fin >> poz >> x;
Update(poz,x);
}
if ( op == 1 )
{
fin >> cst >> cdr;
fout << Sum(cdr) - Sum(cst-1) << '\n';
}
if ( op == 2 )
{
fin >> k;
fout << Search(k) << '\n';
}
}
fin.close();
fout.close();
return 0;
}