Cod sursa(job #3169656)

Utilizator DomnulMilandruMilandru Nicon-David DomnulMilandru Data 15 noiembrie 2023 18:56:18
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb

#include <fstream>
#include <vector>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,x,m;
vector<int> A;
int zeros(int n)
{
    return n & (-n);
}
void update(int nod,int e)
{
    for(int i=nod;i<=n;i=i+zeros(i))
      A[i]=A[i]+e;
}
int suma(int nod)
{
    int s=0;
    for(int i=nod;i>=1;i=i-zeros(i))
      s=s+A[i];
    return s;
}
int q;
int a,b;
int main()
{
    cin>>n>>m;
    A.resize(n+1);
    for(int i=1;i<=n;i++)
    {
     cin>>x;
     update(i,x);
    }
    for(int i=0;i<m;i++)
    {
       cin>>q;
       switch(q)
       {
           case 0:
           {
               cin>>a>>b;
               update(a,b);
               break;
           }
           case 1:
           {
               cin>>a>>b;
               int sa=suma(a-1);
               int sb=suma(b);
               cout<<sb-sa<<'\n';
               break;
           }
           case 2:
           {
               cin>>a;
              int poz=-1,st=1,dr=n;
              while(st<=dr)
              {
                  int mij=st+(dr-st)/2;
                  int s=suma(mij);
                  if(s==a)
                     poz=mij;
                  if(s>=a)
                      dr=mij-1;
                  else
                       st=mij+1;
              }
               cout<<poz<<'\n';
           }
       }
    }
    return 0;
}