Pagini recente » Istoria paginii preoni-2004/clasament-9-10 | Cod sursa (job #3159989) | Cod sursa (job #535530) | Cod sursa (job #1154885) | Cod sursa (job #3249847)
#include <bits/stdc++.h>
#define NMAX 100000
#define int long long
using namespace std;
int v[NMAX + 5];
int n;
void update( int i, int val ){
while( i <= n ){
v[i] += val;
i += ( i & -i );
}
}
int prefixSum( int i ){
int sum = 0;
while( i > 0 ){
sum += v[i];
i -= ( i & -i );
}
return sum;
}
int rangeSum( int i, int j ){
return prefixSum( j ) - prefixSum( i - 1 );
}
signed main()
{
ifstream fin( "aib.in" );
ofstream fout( "aib.out" );
int m, i, op, a, b, rasp, mij, st, dr;
fin >> n >> m;
for( i = 1; i <= n; i++ ){
fin >>a; update(i,a);
}
for( i = 1; i <= m; i++ ){
fin >> op >> a;
if( op == 0 ){
fin >> b;
update( a, b );
}else if( op == 1 ){
fin >> b;
fout << rangeSum( a, b ) << "\n";
}else{
st = 1;
dr =rasp= n;
while( st <= dr ){
mij = ( st + dr ) / 2;
if( prefixSum( mij ) < a )
st = mij+1;
else if(prefixSum(mij)>=a)
{
rasp=mij;
dr=mij-1;
}
}
if(prefixSum(rasp)!=a) fout<<"-1\n";
else fout<<rasp<<"\n";
}
}
return 0;
}