Pagini recente » Cod sursa (job #2419645) | Cod sursa (job #1181630) | Cod sursa (job #102664) | Cod sursa (job #1361293) | Cod sursa (job #1007316)
#include<fstream>
using namespace std;
#define max_n 100010
ifstream f("aib.in");
ofstream g("aib.out");
int Aib[max_n];
int n , q , x , op , a , b;
void update( int poz , int val ){
int nr = 0;
while( poz <= n ){
Aib[poz] += val;
while( (poz & (1<<nr)) == 0 )
nr++;
poz += (1<<nr);
nr++;
}
}
int querry( int poz ){
int sum = 0;
int nr = 0;
while( poz > 0 ){
sum += Aib[poz];
while( (poz & (1<<nr)) == 0 )
nr++;
poz -= (1<<nr);
nr++;
}
return sum;
}
int search( int val ){
int st = 1 , dr = n;
int mid = (st + dr) / 2;
int sum = 0 , poz = 0;
while( st <= dr ){
sum = querry(mid);
if( sum == val ){
poz = mid;
dr = mid - 1;
}
else{
if( sum < val )
st = mid + 1;
else
dr = mid - 1;
}
mid = (st + dr) / 2;
}
return ( poz!=0?poz:(-1) );
}
void read(){
f>>n>>q;
for( int i = 1 ; i <= n ; i++ ){
f>>x;
update( i , x );
}
}
void solve(){
for( ; q ; q-- ){
f>>op;
switch( op ){
case 0:
f>>a>>b;
update(a , b);
break;
case 1:
f>>a>>b;
g<<querry(b) - querry(a-1)<<"\n";
break;
default:
f>>a;
g<<search(a)<<"\n";
break;
}
}
}
int main(){
read();
solve();
return 0;
}