Cod sursa(job #1235498)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 29 septembrie 2014 21:20:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
using namespace std;

int AIB[100005], n;

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

int query(int pos){
   int ans = 0;
   while(pos > 0) {
      ans += AIB[pos];
      pos -= (pos & (-pos));
   }
   return ans;
}

int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int m, a, b, t;

    cin >> n >> m;

    for(int i = 1; i <= n; ++i) {
      cin >> a;
      update(i, a);
    }
    for(int i = 1; i <= m; ++i) {
      cin >> t;
      if(t == 0) {
         cin >> a >> b;
         update(a, b);
      }
      if(t == 1) {
         cin >> a >> b;
         cout << query(b) - query(a - 1) << '\n';
      }
      if(t == 2) {
         cin >> a;
         int st = 1, dr = n;
         int ans = -1;
         while(st <= dr) {
            int mid = (st + dr) / 2;
            int x = query(mid);
            if(x >= a){
               if(x == a) {
                  ans = mid;
                  break;
               }
               dr = mid - 1;
            }
            else
               st = mid + 1;
         }
         cout << ans << '\n';
      }
    }
    return 0;
}