Cod sursa(job #2209441)

Utilizator unknownpersonBidasca Carina Georgiana unknownperson Data 3 iunie 2018 14:10:16
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[100005],i,a,b,cnt;
void add(int,int);
int suma(int),cautare(int);
int main()
{
  f>>n>>m;
  for(i=1;i<=n;i++)
    f>>aib[i];
   for(;m;m--)
   {
       f>>cnt;
       if(cnt==0)
       {
           f>>a>>b;
           add(a,b);

       }
       else
       {if(cnt==1)
       {
           f>>a>>b;
           g<<suma(b)-suma(a-1)<<"\n";

       }
       else
       {
           f>>a;
           //cautare binara,incadrez a intre 2 val si verific daca am egalitate,daca nu afisez -1
           cautare(a);
           g<<"\n";
       }

   }
   }

      return 0;
}
void add(int p,int v)
{
    for(;p<=n;p+=(p&(-p)))
        aib[p]=v;
}
int suma(int p)
{
    int ret=0;
    for(;p;p-=(p&(-p)))
        ret+=aib[p];
    return ret;
}
int cautare(int a)
{
    int poz = n+1, mi;
    int st=0, dr=n+1;

    mi = n;
int  S = suma(mi);

    if ( S == a ) poz = n;

    while ( mi )
    {
          mi = (st+dr)>>1;
          S = suma(mi);

          if ( S > a )
          {
               if ( dr > mi )
                dr = mi;
               mi --;
          }
          else
          if ( S == a )
            {poz = min(poz,mi);
           dr = mi;
          mi --;}
          else
          {
              if ( st < mi )
                st = mi;
              mi ++;
          }

          if ( mi <= st ) break;
          if ( mi >= dr ) break;
    }

    if ( poz == n+1 ) return -1;
    return poz;
}