Pagini recente » Cod sursa (job #2269740) | Statistici stanel (madalin560) | Florian Marcu | Profil AndreiBarbuta | Cod sursa (job #554920)
Cod sursa(job #554920)
#include<fstream>
using namespace std;
#define nn 100001
int a[nn],n,m,t;
void adaugare(int poz,int val){
int c=0;
while(poz<=n){
a[poz]+=val;
while(!(poz&(1<<c))) ++c;//daca al c-lea bit al lui poz este 0 c creste
poz+=(1<<c);
++c;
}
}
int suma(int poz){
int s=0,c=0;
while(poz>0){
s+=a[poz];
while(!poz&(1<<c)) ++c;//daca al c-lea bit al lui poz este 0 c creste
poz-=(1<<c);//din poz se scade valoarea 2 la puterea c
++c;//c creste
}
}
int cautare(int k){
int i,pas;
for(pas=1;pas<n;pas<<=1)
for(i=0;pas;pas>>=1){
if(i+pas<=n){
if(k >= a[i+pas]){
i+=pas, k-=a[i];
if(!k) return i;
}
}
}
return -1;
}
int main(){
int i,x,y,z;
memset(a,0,sizeof(a));
ifstream fin("aib.in");
FILE *f=fopen("aib.out","w");
fin>>n>>m;
for(i=1;i<=n;++i){
fin>>x;
adaugare(i,x);
}
for(i=1;i<=m;++i){
fin>>x;
if(x<2){
fin>>y>>z;
if(x==0) adaugare(y,z);
else
fprintf(f,"%d\n",suma(z)-suma(y-1));//intervalul [a,b]
}
else{
fin>>y;
fprintf(f,"%d\n",cautare(y));
}
}
return 0;
}