Cod sursa(job #173599)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 7 aprilie 2008 21:07:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 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 p=0,x=1;
    if (!sum) return -1;
    for (;x<n;x<<=1);
    for (;x>0;x>>=1)
        if (p+x<=n)
         if (s[p+x]<=sum){
               p+=x;
               sum-=s[p];}
    return (!sum?p:-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;
}