Cod sursa(job #174447)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 8 aprilie 2008 21:10:07
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>   
long x[100001],n,m,i,val,ad,poz,cod,st,dr,s,salt,saltmax,ok;
int main()   
{   
    freopen("aib.in","rt",stdin);   
    freopen("aib.out","wt",stdout);   
    scanf("%ld%ld",&n,&m);   
    saltmax=1;   
    while(saltmax<n)saltmax<<=1;   
    for(i=1;i<=n;i++)   
    { scanf("%ld",&val);   
      poz=i;   
      for(ad=1;poz<=n;ad<<=1)   
       if(ad&poz){x[poz]+=val;poz+=ad;}   
    }   
    for(;m;m--)   
    { scanf("%ld",&cod);   
      if(!cod)   
      { scanf("%ld%ld",&poz,&val);   
        for(ad=1;poz<=n;ad<<=1)   
         if(ad&poz){x[poz]+=val;poz+=ad;}   
        continue;   
      }   
      if(cod==1)   
      { scanf("%ld%ld",&st,&dr);   
        s=0;   
        poz=dr;   
        for(ad=1;poz;ad<<=1)   
         if(ad&poz){s+=x[poz];poz-=ad;}   
        poz=st-1;   
        for(ad=1;poz;ad<<=1)   
         if(ad&poz){s-=x[poz];poz-=ad;}   
        printf("%ld\n",s);   
        continue;   
      }   
      scanf("%ld",&s);   
      if(!s){printf("0\n");continue;}
      poz=0;ok=0;
      for(salt=saltmax;salt;salt>>=1)   
      { if(poz+salt<=n)   
         if(s>=x[poz+salt])   
          {poz+=salt;s-=x[poz];}   
        if(!s)   
        {printf("%ld\n",poz);ok=1;break;}   
      }   
      if(!ok)printf("-1\n");   
    }   
    fcloseall();   
    return 0;   
}