Nu aveti permisiuni pentru a descarca fisierul grader_test10.in
Cod sursa(job #1099076)
Utilizator | Data | 5 februarie 2014 15:38:45 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.79 kb |
#include <cstdio>
#define NMAX 100001
int n,m;
int V[NMAX];
void update(int ind,int val){
int poz = 0;
while(ind <=n){
V[ind]+=val;
while((ind & (1<<poz)) == 0)
++poz;
ind += (1<<poz);
poz++;
}
}
int Sum(int dr){
int S = 0;
int poz = 0;
while(dr > 0){
S+= V[dr];
while((dr & (1<<poz)) == 0)
poz++;
dr = dr - (1<<poz);
poz++;
}
return S;
}
int Search(int x){
int left = 1;
int right = n;
int m;
while(left<=right){
m = (left+right)/2;
if(Sum(m) == x)
return m;
else{
if(Sum(m) < x){
if(Sum(m+1) > x)
return -1;
left = m+1;
}
else{
if(Sum(m-1) < x)
return -1;
right = m-1;
}
}
}
}
int main(){
int a,b,st,dr;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
int val;
for(register int i=1;i<=n;++i){
scanf("%d",&val);
update(i,val);
}
int option;
while(m){
scanf("%d",&option);
switch(option){
case 0: scanf("%d%d",&a,&b);
update(a,b);
break;
case 1: scanf("%d%d",&st,&dr);
printf("%d\n",Sum(dr) - Sum(st-1));
break;
case 2: scanf("%d",&a);
printf("%d\n",Search(a));
break;
};
--m;
}
return 0;
}