Cod sursa(job #1401866)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 26 martie 2015 10:28:54
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
int n,m;
int arb[200001];
int nr;
void update(int s,int e,int pos,int nod)
{
     if(s==e) arb[nod]+=nr;
     else
     {
         int mij=(s+e)/2;
         if(pos<=mij) update(s,mij,pos,2*nod);
         else update(mij+1,e,pos,2*nod+1);
         arb[nod]=arb[2*nod]+arb[2*nod+1];
     }
}
int query(int s,int e,int p1,int p2,int nod)
{
    if(p1==s&&p2==e) return arb[nod];
    else
    {
        int mij=(s+e)/2;
        if(p2<=mij) return query(s,mij,p1,p2,2*nod);
        else if(p1>mij) return query(mij+1,e,p1,p2,2*nod+1);
        return query(s,mij,p1,mij,2*nod)+query(mij+1,e,mij+1,p2,2*nod+1);
    }
}
int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
            scanf("%d",&nr);
            update(1,n,i,1);
    }
    int tip,n1,n2;
    for(int i=1;i<=m;i++)
    {
            scanf("%d",&tip);
            if(tip==0)
            {
                      scanf("%d%d",&n1,&nr);
                      update(1,n,n1,1);
            }
            else if(tip==1)
            {
                 scanf("%d%d",&n1,&n2);
                 printf("%d\n",query(1,n,n1,n2,1));
            }
            else if(tip==2)
            {
                 scanf("%d",&n1);
                 int s=1,e=n,rasp=0;
                 while(s<=e)
                 {
                            int mij=(s+e)/2,val=query(1,n,1,mij,1);
                            if(val==n1)
                            {
                                       rasp=mij;
                                       e=mij-1;
                            }
                            else if(val<n1)
                            {
                                 s=mij+1;
                            }
                            else e=mij-1;
                 }
                 if(rasp==0) rasp--;
                 printf("%d\n",rasp);
            }
    }
}