Cod sursa(job #2963196)

Utilizator Vincent47David Malutan Vincent47 Data 10 ianuarie 2023 11:46:20
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>

using namespace std;

    ifstream cin("aib.in");
    ofstream cout("aib.out");

    int n;
    const int NMAX = 100001;
    int aib[NMAX];

    void update(int p,  int v)
    {
        for (int i = p; i <= n; i += i & - i)
            aib[i] += v;
    }

    int query(int p)
    {
        int sum = 0;
        for (int i = p; i; i -= i & -i)
            sum += aib[i];

        return sum;
    }



int main()
{
    int m, i, x, tip, p, a, b;
    cin >> n >> m;

    for (i = 1; i <= n; ++i) {
        cin >> x;
        update(i, x);
    }

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

        cin >> tip;
        if (tip == 0)
        {
            cin >> p >> x;
            update(p, x);
        }

        else if (tip == 1)
        {
            cin >> a >> b;
            cout << query(b) - query(a - 1) << '\n';
        }

        else {
            cin >> x;
            int st = 0, dr = n + 1;
            int pos = n + 1;
            int m = n;
        int s = query(m);

        if ( s == x ) pos = n;

        while ( m )
        {
          m = (st + dr)>>1;
          s = query(m);

          if ( s > x )
          {
               if (dr > m ) dr = m;
               m -= 1;
          }
          else if ( s == x ) pos = min(pos, m), dr = m, m -= 1;
          else
          {
              if ( st < m ) st = m;
              m += 1;
          }

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

    if ( pos == n+1 ) cout << -1 << '\n';

    else
    cout << pos << '\n';
        }

    }
    return 0;
}

/*
8 3
25 42 8 15 1 55 16 67
0 5 12
2 25
2 90
1 7 7
1 2 8
2 241
*/