Pagini recente » Cod sursa (job #676330) | Cod sursa (job #2869386) | Cod sursa (job #2837969) | Cod sursa (job #1136099) | Cod sursa (job #1007318)
#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;
inline int zero( int x ){
return ((x^(x-1)) & x) ;
}
inline void update( int poz , int val ){
int nr = 0;
while( poz <= n ){
Aib[poz] += val;
poz += zero(poz);
nr++;
}
}
inline int querry( int poz ){
int sum = 0;
int nr = 0;
while( poz > 0 ){
sum += Aib[poz];
poz -= zero(poz);
nr++;
}
return sum;
}
inline 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) );
}
inline void read(){
f>>n>>q;
for( int i = 1 ; i <= n ; i++ ){
f>>x;
update( i , x );
}
}
inline 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;
}