Cod sursa(job #1846553)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 13 ianuarie 2017 12:44:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,p1,Q,S,AIB[100005],R;
/*int Quest(int q,int x,int y,int st,int dr)
     {int mid=(st+dr)/2;
      if(x==st&&y==dr)return v[q];
       else{if(y<=mid)return Quest(q*2,x,y,st,mid);
            if(x>mid)return Quest(q*2+1,x,y,mid+1,dr);
            return Quest(q*2,x,mid,st,mid)+Quest(q*2+1,mid+1,y,mid+1,dr);
           }
     }
void Quest1(int st,int dr,int q)
           {int mid=(st+dr)/2;
            if(st==dr){Q=st;}
            else{if(v[q*2]<S){S=S-v[q*2];Quest1(mid+1,dr,q*2+1);}
                  else Quest1(st,mid,q*2);
                }
           }
*/
int zeros(int x)
   {return (x^(x-1))&x;
   }
void Add(int x,int quanty)
    {int i;
     for(i=x;i<=n;i=i+zeros(i))
        {AIB[i]+=quanty;
        }
    }
int Compute(int x)
    {int i,s=0;
     for(i=x;i>0;i=i-zeros(i))
        s=s+AIB[i];
     return s;
    }
void CautBin(int st,int dr)
     {int mid=(st+dr)/2;
      if(st==dr)R=st;
      else{if(Compute(mid)<S)CautBin(mid+1,dr);
      else CautBin(st,mid);
      }
     }
int main()
{int x,y,x1,y1,i;
 fin>>n>>m;
 for(i=1;i<=n;i++)
    {fin>>x;
     Add(i,x);
    }
 for(i=1;i<=m;i++)
    {fin>>p1;
     if(p1==0){fin>>x>>y;
               Add(x,y);
             }
     else if(p1==1){fin>>x>>y;
                    fout<<Compute(y)-Compute(x-1)<<"\n";
                   }
     else if(p1==2){fin>>S;
                    CautBin(1,n);
                    if(Compute(R)==S)fout<<R<<"\n";
                    else fout<<"-1\n";
                   }
    }

}