Pagini recente » Cod sursa (job #2659144) | Cod sursa (job #2664251)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "aib.in" );
ofstream fout( "aib.out" );
const int NMAX = 100005;
const int INF = 2000000000;
int N, Q;
int t[NMAX];
void Update( int p, int val ) {
while( p <= N ) {
t[p] += val;
p += p & ( -p );
}
}
int Query( int p ) {
int ans = 0;
while( p > 0 ) {
ans += t[p];
p -= p & ( -p );
}
return ans;
}
int BinSearch( int lf, int rg, int val ) {
if( lf > rg ) return INF;
int mid = lf + ( rg - lf ) / 2;
if( Query( mid ) > val ) return BinSearch( lf, mid - 1, val );
else
if( Query( mid ) == val ) return min( mid, BinSearch( lf, mid - 1, val ) );
else return BinSearch( mid + 1, rg, val );
}
void Read() {
fin >> N >> Q;
int tmp;
for( int i = 1; i <= N; ++i ) {
fin >> tmp;
Update( i, tmp );
}
int task, a, b;
for( int i = 1; i <= Q; ++i ) {
fin >> task >> a;
if( task < 2 ) fin >> b;
if( task == 0 ) Update( a, b );
if( task == 1 ) fout << Query( b ) - Query( a - 1 ) << '\n';
if( task == 2 ) {
int ans = BinSearch( 1, N, a );
if( ans == INF ) fout << "-1\n";
else fout << ans << '\n';
}
}
}
int main()
{
Read();
return 0;
}