Pagini recente » Cod sursa (job #28996) | Cod sursa (job #469052) | Cod sursa (job #3209226) | Cod sursa (job #660234) | Cod sursa (job #1394454)
#include <fstream>
#define NMax 100005
using namespace std;
long aib[NMax], n, m, a, b, ok, x;
void Update (int poz, int val) {
while (poz < NMax) {
aib[poz]+= val;
poz += poz&(-poz);
}
}
int Querry (int poz) {
int sum = 0;
while (poz) {
sum += aib[poz];
poz -= poz & (-poz);
}
return sum;
}
long bfind ( long left, long right, long s ) {
long middle, S;
if ( s < Querry ( left ) || Querry ( right ) < s )
return -1;
while ( left <= right ) {
middle = left + ( right - left ) / 2;
S = Querry ( middle );
if ( S == s )
return middle;
else if ( s < S )
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
int main ( )
{
ifstream fin ("aib.in");
ofstream fout ("aib.out");
fin >> n >> m;
for ( long i = 1; i <= n; i++ ) {
fin >> x;
Update ( i, x );
}
for ( long i = 1; i <= m; i++ ) {
fin >> ok;
if ( ok < 2 ) {
fin >> a >> b;
if ( ok == 0 )
Update ( a, b );
else
fout << Querry ( b ) - Querry ( a - 1 ) << '\n';
}
else {
fin >> a;
fout << bfind ( 1, n, a ) << '\n';
}
}
return 0;
}