Pagini recente » Cod sursa (job #2166352) | Cod sursa (job #1209787) | Cod sursa (job #376663) | Cod sursa (job #3354934) | Cod sursa (job #3154374)
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
int aib[nmax], n;
void update( int poz, int val ) {
while( poz <= n ) {
aib[poz] += val;
poz += (-poz)&poz;
}
}
int query( int poz ) {
int s = 0;
while( poz > 0 ) {
s+= aib[poz];
poz -= poz&(-poz);
}
return s;
}
int cautbin( int l, int r, int val ) {
if( r - l <= 1 )
return l;
else {
int mij = (l+r)/2;
int valm = query(mij);
if( valm >= val ) {
return cautbin( l, mij, val );
} else {
return cautbin( mij, r, val );
}
}
}
int main()
{
int m, i, x, j, cer, a, b, rez;
ifstream cin("aib.in");
ofstream cout("aib.out");
cin >> n >> m;
for( i = 1; i <= n; i++ ) {
cin >> x;
update( i, x );
}
for( j = 0; j < m; j++ ) {
cin >> cer;
if( cer == 0 ) {
cin >> a >> b;
update( a, b );
} else if( cer == 1 ) {
cin >> a >> b;
cout << query(b) - query(a-1) << "\n";
} else {
cin >> a;
rez = cautbin( 0, n, a ) + 1;
if( query(rez) == a )
cout << rez << "\n";
else
cout << "-1\n";
}
}
return 0;
}