Cod sursa(job #173548)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 7 aprilie 2008 20:32:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
const int nmax=100001;
int n,m,i,j,k,s[nmax];
void update(int poz,int val){
     while (poz<=n){s[poz]+=val;
                   poz=(poz|(poz-1))+1;}
     }
int query(int poz){
     int sum=0;
     while (poz>0) {sum+=s[poz];
                    poz&=(poz-1);}
     return sum;
     }
int search(int sum){
    int ls=1,ld=n,mij,aux;
    while (ls<=ld){
          mij=(ls+ld)/2;
          aux=query(mij);
          if (aux==sum) return mij;
          if (aux>sum) ld=mij-1;
                  else ls=mij+1;
          }
    return -1;
    }
int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);    
    for (i=1;i<=n;i++) {scanf("%d",&j);
                        update(i,j);}
    while (m--) {scanf("%d",&i);
                 if (i==2) {scanf("%d",&j);
                            printf("%d\n",search(j));}
                     else  {scanf("%d %d",&j,&k);
                            if (i==0) update(j,k);
                                 else printf("%d\n",query(k)-query(j-1));
                            }
                 }
    return 0;
}