Cod sursa(job #2499705)

Utilizator Vlad.Vlad Cristian Vlad. Data 26 noiembrie 2019 17:43:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

#include <iostream>

using namespace std;

ifstream fin("aib.in");

ofstream fout("aib.out");

int n, m;

long a[100010];

int highestPowerOf2(int n) {

    int pow = 1;

    while (pow <= n) {

        pow *= 2;

    }

    return pow / 2;

}

void update(int p, int v) {

    for (int i = p; i <= n; i += i & -i) {

        a[i] += v;

    }

}

long query(int p) {

    long s = 0;

    for (int i = p; i > 0; i -= i & -i) {

        s += a[i];

    }

    return s;

}

int Search(int Sum)
{

    int pos = n+1, B;

    int limst=0, limdr=n+1;



    B = n;

    int S = query(B);



    if ( S == Sum ) pos = n;



    while ( B )

    {

          B = (limst+limdr)>>1;

          S = query(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;

}


void citire() {

    fin >> n >> m;

    int val;

    for (int i = 1; i <= n; ++i) {

        fin >> val;

        update(i, val);

    }

}

int main()

{

    citire();

    int c;

    long x, y;

    for (int i = 1; i <= m; ++i) {

        fin >> c >> x;

        if (c == 0) {

            fin >> y;

            update(x, y);

        }

        else if (c == 1) {

            fin >> y;

            fout << query(y) - query(x - 1) << "\n";

        }

        else {

            fout << Search(x) << "\n";

        }

    }

    return 0;

}