Cod sursa(job #2173110)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 15 martie 2018 20:36:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <cstdio>
#define NMAX 100005

using namespace std;

int N, M, aib[NMAX];

int zero(int t) {
    return (t ^ (t - 1)) & t;
}

void adaugareVector(int val, int poz) {
    for(int i = poz; i <= N; i += zero(i)) {
        aib[i] += val;
    }
}

void read() {
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= N; ++i) {
        int x;
        scanf("%d", &x);
        adaugareVector(x, i);
    }
}

int suma(int st, int dr) {
    int s1 = 0, s2 = 0;
    for(int i = dr; i >= 1; i -= zero(i)) {
        s1 += aib[i];
    }
    for(int i = st - 1; i >= 1; i -= zero(i)) {
        s2 += aib[i];
    }
    return s1 - s2;
}

int pozMinima(int val) {
    int st = 1, dr = N;
    while(st <= dr) {
        int mij = (st + dr) / 2;
        int sum = suma(1, mij);
        if(sum == val) {
            return mij;
        }
        if(sum <= val) {
            st = mij + 1;
        }
        else {
            dr = mij - 1;
        }
    }
    return -1;
}

void makeOperations() {
    for(int i = 1; i <= M; ++i) {
        int op, x, y;
        scanf("%d", &op);
        if(op == 0) {
            scanf("%d %d", &x, &y);
            adaugareVector(y, x);
        }
        else if(op == 1) {
            scanf("%d %d", &x, &y);
            int sol = suma(x, y);
            printf("%d\n", sol);
        }
        else {
            scanf("%d", &x);
            int sol = pozMinima(x);
            printf("%d\n", sol);
        }
    }
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    read();
    makeOperations();
    return 0;
}