Pagini recente » Cod sursa (job #1739693) | Cod sursa (job #1206282) | Cod sursa (job #694265) | Cod sursa (job #1601299) | Cod sursa (job #312792)
Cod sursa(job #312792)
#include<stdio.h>
#define NMAX 100001
long c[NMAX],n,m,k,i,op,a,b;
int nz(int k) {
int z=0;
while(k%2==0) { z++; k/=2; }
return z;
}
void add(int i,int k) {
while(i<=n) {
c[i]+=k;
i+=1<<nz(i);
}
}
long sum(int i) {
int s=0;
while(i) {
s+=c[i];
i-=1<<nz(i);
}
return s;
}
long sum(int a,int b) { return sum(b)-sum(a-1); }
long poz(int a,int b,int k) {
int mid=a+(b-a)/2;
int s=sum(mid);
if(a==b) return (s==k)?a:-1;
else return (k<s)?((a!=mid)?poz(a,mid-1,k):-1):((k>s)?poz(mid+1,b,k):mid);
}
int main() {
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld %ld",&n,&m);
for(i=1;i<=n;i++) c[i]=0;
for(i=1;i<=n;i++) { scanf("%ld",&k); add(i,k); }
for(i=0;i<m;i++) {
scanf("%ld %ld",&op,&a);
if(op!=2) scanf("%d",&b);
switch(op) {
case 0: add(a,b); break;
case 1: printf("%ld\n",sum(a,b)); break;
case 2: printf("%ld\n",poz(1,n,a)); break;
}
}
fclose(stdin);
fclose(stdout);
return 0;
}