Pagini recente » Cod sursa (job #2616477) | Cod sursa (job #446821) | Cod sursa (job #2562238) | Cod sursa (job #1656360) | Cod sursa (job #897567)
Cod sursa(job #897567)
#include<fstream>
using namespace std;
#define max_n 100010
ifstream f("aib.in");
ofstream g("aib.out");
int n , m , op , a , b , L[max_n] , nr;
void update(int , int);
void read(){
f>> n >> m;
for(int i = 1; i <= n; i++){
f>>nr;
update(i,nr);
}
}
void update(int a , int b){
int nr = 0;
while(a <= n){
L[a]+=b;
while( !(a&(1<<nr)) )
nr++;
a+=(1<<nr);
nr+=1;
}
}
int querry(int a){
int nr = 0;
int sum = 0;
while(a > 0){
sum+=L[a];
while( !(a&(1<<nr)) )
nr++;
a-=(1<<nr);
nr+=1;
}
return sum;
}
int find(int a){
int st=1,dr=n;
int mid = (st + dr)/2;
int x , sol = -1;
while(st <= dr){
x=querry(mid);
if(x==a){
sol=mid;
dr=mid-1;
}
else{
if(x<a)
st=mid+1;
else
dr=mid-1;
}
mid = (st + dr)/2;
}
return sol;
}
void solve(){
for(int i = 1; i <= m; i++){
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<<find(a)<<"\n";
break;
}
}
}
int main(){
read();
solve();
return 0;
}