Pagini recente » Cod sursa (job #2488795) | Cod sursa (job #1699161) | Cod sursa (job #2328513) | Cod sursa (job #157326) | Cod sursa (job #1960632)
#include <stdio.h>
using namespace std;
FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");
int arb[100008];
int n;
void adauga(int p, int a){
int b=0;
while (p<=n){
arb[p]+=a;
b=(p&(p-1))^p;
p+=b;
}
}
int suma(int p){
int b=0,s=0;
while (p>0){
s+=arb[p];
b=(p&(p-1))^p;
p-=b;
}
return s;
}
int cauta(int s){
int p=1,u=n,mij,smij;
while (p<=u){
mij=(p+u)/2;
smij=suma(mij);
if (smij==s) return mij;
if (smij<s) p=mij+1;
else u=mij-1;
}
return -1;
}
int main()
{
int m,a,b,p,i;
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=n;i++){
fscanf(f,"%d",&a);
adauga(i,a);
}
while (m){
m--;
fscanf(f,"%d",&p);
if (p==2){
fscanf(f,"%d",&a);
fprintf(g,"%d\n",cauta(a));
}
else{
fscanf(f,"%d%d",&a,&b);
if (p==1){
fprintf(g,"%d\n",suma(b)-suma(a-1));
}
else{
adauga(a,b);
}
}
}
fclose(f);
fclose(g);
return 0;
}