Cod sursa(job #2525632)

Utilizator nicolaee2Martinescu Nicolae nicolaee2 Data 17 ianuarie 2020 17:08:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100005

ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[NMAX];
int n,m;

void update(int index,int val)
{
   while(index<=n)
   {
      aib[index]+=val;
      index += index & (-index);
   }

}

int suma(int index)
{
   int sum = 0;
   while(index > 0)
   {
      sum+=aib[index];
      index -= index & (-index);
   }

   return sum;
}

void citire()
{
   fin>>n>>m;
   for(int i=1;i<=n;i++)
   {
      int x;
      fin>>x;
      update(i,x);
   }

}

void rezolva()
{
   int c;
   for(int i=1;i<=m;i++)
   {
      fin>>c;

      if(c==0)
      {
         int a,b;
         fin>>a>>b;
         update(a,b);
      }
      else if(c==1)
      {
         int a,b;
         fin>>a>>b;
         if(a > b)
            swap(a,b);

         fout<<suma(b) - suma(a-1)<<'\n';

      }
      else
      {
         int a;
         fin>>a;

         int ok = 0;
         int st = 1;
         int dr = n;
         //for(int i=1;i<=n;i++)
            //fout<<suma(i)<<" ";
         //fout<<endl;

         while(st <= dr && !ok)
         {
            int mij = (st + dr)/2;
            if(suma(mij) == a)
            {
               ok=1;
               fout<<mij<<'\n';
            }
            else if(suma(mij) < a)
               st = mij+1;
            else
               dr = mij-1;
         }

         if(!ok)
            fout<<-1<<'\n';

      }
   }
}

int main()
{

   citire();
   rezolva();

    return 0;
}