Pagini recente » Cod sursa (job #711053) | Cod sursa (job #199481) | Cod sursa (job #1824258) | Istoria paginii runda/tot_/clasament | Cod sursa (job #1284369)
#include <fstream>
using namespace std;
ifstream is("aib.in");
ofstream os("aib.out");
const int DIM = 100010;
int n, m, a, b;
int aib[DIM];
void Read();
void Solve();
void Update( int p, int v )
{
for ( int i = p; i <= n; i += i & -i )
aib[i] += v;
}
int Suma( int p )
{
int s = 0;
for ( int i = p; i; i -= i & -i )
s += aib[i];
return s;
}
int Bs( int v )
{
int i = 0;
int p = 1 << 15;
for ( p = 1; p < n; p <<= 1 );
for ( ; p; p >>= 1 )
if ( i + p <= n && Suma(i+p) <= v )
i += p;
if ( Suma(i) == v )
return i;
return -1;
}
int main()
{
Read();
Solve();
//for ( int i = 1; i <= n; ++i )
//os << aib[i] << ' ';
is.close();
os.close();
return 0;
}
void Read()
{
is >> n >> m;
int nr;
for ( int i = 1; i <= n; ++i )
{
is >> nr;
Update( i, nr );
}
}
void Solve()
{
for ( int k = 0; k < m; ++k )
{
is >> k >> a;
if ( k == 0 )
{
is >> b;
Update ( a, b );
}
if ( k == 1 )
{
is >> b;
os << Suma(b) - Suma(a-1) << '\n';
}
if ( k == 2 )
{
os << Bs(a) << '\n';
}
}
}