Pagini recente » Cod sursa (job #271957) | Cod sursa (job #1887638) | Cod sursa (job #2901804) | Cod sursa (job #1660625) | Cod sursa (job #2100122)
#include <iostream>
#include <fstream>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, aib[100002];
void add(int x, int quantity){
for(int i=x; i<=n; i+=zeros(i))
aib[i]+=quantity;
}
int compute(int x){
int s=0;
for(int i=x; i>0; i-=zeros(i))
s+=aib[i];
return s;
}
int cautareBinara(int a){
int li=1, ls=n, m=0, suma=0;
while(li<=ls){
m=(li+ls)/2;
suma=compute(m);
if(suma==a)
return m;
else if(suma>a)
ls=m;
else li=m+1;
}
}
void citire(){
int k, a, b;
f>>n>>m;
for(int i=1; i<=n; i++){
f>>k;
add(i, k);
}
for(int j=1; j<=m; j++){
f>>k;
if(k==0){
f>>a>>b;
add(a, b);
}
else if(k==1){
f>>a>>b;
g<<compute(b)-compute(a-1)<<"\n";
}
else if(k==2){
f>>a;
g<<cautareBinara(a)<<"\n";
}}
}
int main()
{
citire();
return 0;
}