Cod sursa(job #2282544)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 14 noiembrie 2018 00:10:15
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>

const int NMAX = 100005;
const int MMAX = 150005;

int N, M;
int arb[NMAX];

void create_aib() {
   for (int ix = 1; ix <= N; ++ix) {
      int ix2 = ix + (ix & (-ix));
      if (ix2 <= N) {
         arb[ix2] += arb[ix];
      }
   }
}

void update(int ix, int val) {
   while (ix <= N) {
      arb[ix] += val;
      ix +=  ix & (-ix);
   }
}

int prefix(int ix) {
   int result = 0;
   while (ix >= 1) {
      result += arb[ix];
      ix -= ix & (-ix);
   }
   return result;
}

int range(int ix1, int ix2) {
   return prefix(ix2) -  prefix(ix1 - 1);
}


int search(int val) {
   int lgN;
   for (lgN = 1; lgN < N; lgN <<= 1);

   for (int step = lgN, i = 0; step; step >>= 1) {
      if ( i + step <= N && arb[i + step] <= val) {
         val -= arb[i+step];
         i += step;
      }
      if (val == 0 && i != 0) {
         return i;
      }
   }

   return -1;
}

int main() {
   freopen("aib.in", "r", stdin);
   freopen("aib.out", "w", stdout);

   scanf("%d%d", &N, &M);

   for (int i = 1; i <= N; ++i) {
     scanf("%d",&arb[i]);
   }

   create_aib();

   for (int i = 0; i < M; ++i) {
      int m;
      scanf("%d", &m);
      if (m == 0) {
         int n1, n2;
         scanf("%d%d", &n1, &n2);
         update(n1, n2);
      } else if (m == 1) {
         int n1, n2;
         scanf("%d%d", &n1, &n2);
         printf("%d\n", range(n1, n2));
      } else {
         int n1;
         scanf("%d", &n1);
         printf("%d\n", search(n1));
      }
   }

   return 0;
}