Pagini recente » Cod sursa (job #784924) | Cod sursa (job #2831958) | Cod sursa (job #2955284) | Cod sursa (job #1057109) | Cod sursa (job #3267261)
#include<fstream>
using namespace std;
int c[100001], n, m;
ofstream g("aib.out");
void modifica(int i, int x){
int poz=0;
while(i<=n){
c[i]+=x;
while((i&(1<<poz))==0)
++poz;
i+=(1<<poz);
}
}
int suma(int a, int b){
if(a==1){
int poz=0, s=0;
while(b>0){
s+=c[b];
while((b&(1<<poz))==0)
++poz;
b-=(1<<poz);
}
return s;
}
else return (suma(1,b)-suma(1,a-1));
}
int bs(int l, int r, int a){
if(l>r) return -1;
int m=(l+r)/2;
int s=suma(1,m);
if(s>a) return bs(l,m-1,a);
if(s<a) return bs(m+1, r,a);
if(s==a) return m;
}
int fu(int a){
int k;
k=bs(1,n,a);
return k;
}
void op(int i,int a, int b){
switch(i){
case 0: modifica(a,b);break;
case 1: g<<suma(a,b)<<'\n';break;
case 2: g<<fu(a)<<'\n';break;
}
}
int main(){
int i, x, a, b;
ifstream f("aib.in");
f>>n>>m;
for(i=1;i<=n;i++){
f>>x;
modifica(i,x);
}
for(i=0;i<m;i++){
f>>x;
if(x==2){
f>>a;
op(x,a,0);
}
else{
f>>a>>b;
op(x,a,b);
}
}
f.close();
g.close();
return 0;
}