Pagini recente » Cod sursa (job #3345628) | Cod sursa (job #1696772) | Cod sursa (job #1253602) | Cod sursa (job #3326980) | Cod sursa (job #3352131)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in") ;
ofstream fout ("aib.out") ;
vector < long long > aib ;
int n ;
void update ( int ind , long long val )
{
for ( int i = ind ; i <= n ; i += i & ( -i ) )
aib[i] += val ;
}
long long query ( int ind )
{
long long sum = 0 ;
for ( int i = ind ; i >= 1 ; i -= i & ( -i) )
sum += aib[i] ;
return sum ;
}
int main()
{
int q ;
fin >> n >> q ;
aib.resize(n+1) ;
for ( int i = 1 ; i <= n ; i ++ )
{
long long x ;
fin >> x ;
update ( i , x ) ;
}
while ( q -- )
{
int caz ;
fin >> caz ;
if ( caz == 0 )
{
int ind ;
long long val ;
fin >> ind >> val ;
update ( ind , val ) ;
}
else if ( caz == 1 )
{
int st , dr ;
fin >> st >> dr ;
long long sum = query ( dr ) ;
sum -= query ( st - 1 ) ;
fout << sum << '\n' ;
}
else
{
long long a ;
fin >> a ;
int st = 1 , dr = n , poz = -1 ;
while ( st <= dr )
{
int mid = ( st + dr ) / 2 ;
long long sum = query ( mid ) ;
if ( sum == a )
{
poz = mid ;
break ;
}
else if ( sum < a )
st = mid + 1 ;
else
dr = mid - 1 ;
}
fout << poz << '\n' ;
}
}
return 0;
}