Pagini recente » Cod sursa (job #1854886) | Cod sursa (job #76528) | Cod sursa (job #371117) | Cod sursa (job #2660158) | Cod sursa (job #2327026)
#include <fstream>
using namespace std;
ifstream fin( "aib.in" );
ofstream fout( "aib.out" );
const int NMAX = 100005;
int N, M;
int a[NMAX];
int tree[NMAX];
void Update( int index, int val )
{
while( index <= N )
{
tree[index] += val;
index += ( index & -index );
}
}
int Query( int lf, int rg )
{
int ans = 0;
while( rg > 0 )
{
ans += tree[rg];
rg -= ( rg & -rg );
}
--lf;
int ans2 = 0;
while( lf > 0 )
{
ans2 += tree[lf];
lf -= ( lf & -lf );
}
//fout << ans << ' ' << ans2 << '\n';
return ans - ans2;
}
void Read()
{
fin >> N >> M;
for( int i = 1; i <= N; ++i )
{ fin >> a[i];
Update( i, a[i] );
}
int tip, a, b;
for( int i = 1; i <= M; ++i )
{
fin >> tip;
if( tip == 0 )
{
fin >> a >> b;
Update( a, b );
}
if( tip == 1 )
{
fin >> a >> b;
fout << Query( a, b ) << '\n';
}
if( tip == 2 )
{
fin >> a;
int lf = 1, rg = N, mid, res, ans;
bool found = false;
while( !found && lf <= rg )
{
mid = ( lf + rg ) / 2;
res = Query( 1, mid );
if( res == a )
{
ans = mid;
found = true;
}
else
if( res > a ) rg = mid - 1;
else lf = mid + 1;
}
if( found ) fout << ans << '\n';
else fout << "-1\n";
}
}
}
int main()
{
Read();
return 0;
}