Cod sursa(job #2924095)

Utilizator TudorMMPopescu Tudor Mihai TudorMM Data 25 septembrie 2022 12:39:10
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");

int n,k,S;
vector <int> aib;

int ps(int a)
{
    int sum=0;
    while (a>0)
    {
        sum+=aib[a];
        a-=(a&-a);
    }
    return sum;
}

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

int query(int a, int b)
{
    return ps(b)-ps(a-1);
}

int Search(int Sum)
{
    int pos=n+1, B;
    int limst=0, limdr=n+1;
    B=n;
    S=ps(B);
    if ( S==Sum ) pos=n;

    while ( B )
    {
          B=(limst+limdr)>>1;
          S=ps(B);
          if (S>Sum)
          {
               if (limdr>B) limdr=B;
               B-=1;
          }
          else if (S==Sum) pos=min(pos,B), limdr=B, B-=1;
          else
          {
              if (limst<B) limst=B;
              B+=1;
          }
          if (B<=limst) break;
          if (B>=limdr) break;
    }
    if (pos==n+1) return -1;
    return pos;
}

int main()
{
    in>>n>>k;
    aib.assign(n+1, 0);
    for (int i=1; i<=n; i++)
    {
        int x;
        in>>x;
        update(i,x);
    }
    for (int i=0; i<k; i++)
    {
        int cer,a,b;
        in>>cer>>a;
        if (cer==0)
        {
            in>>b;
            update(a,b);
        }
        else if (cer==1)
        {
            in>>b;
            out<<query(a,b)<<endl;
        }
        else {out<<Search(a)<<endl;}
    }
    return 0;
}