Cod sursa(job #3217497)

Utilizator ililogIlinca ililog Data 23 martie 2024 11:25:34
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include<fstream>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

#define NMAX 100001

int n, Q;
int v[2*NMAX];
int tip, a,b;

void update(int poz, int val) {
    for (int i = poz; i<=n; i+= (i&-i)) { ///adun ultima putere a lui 2
        v[i] += val;
    }
}

int query(int st, int dr) {

    int ans1 = 0, ans2 = 0;
    for (int i = st-1; i>=1; i-= (i&-i)) { ///scad ultima putere a lui 2
        ans1 += v[i];
    }
    for (int i = dr; i>=1; i-= (i&-i)) { ///scad ultima putere a lui 2
        ans2 += v[i];
    }
    return ans2 - ans1;
}

int cautbin(int val) {

    int st = 0, dr = n+1, mid, ans = -1;
    while (dr-st > 1) {
        mid = (st+dr)/2;
        int aux = query(0,mid);
        if (aux > val) {
            dr = mid;
        } else if (aux < st) {
            st = mid;
        } else {
            ans = mid;
            break;
        }
    }
    return mid;
}

int main()
{
    fin >> n >> Q;
    for (int i = 1; i<=n; i++) {
        fin >> a;
        update(i,a);
    }

    while (Q--) {

        fin >> tip;

        if (tip == 0) {
            fin >> a >> b;
            update(a,b);
        } else if (tip == 1) {
            fin >> a >> b;
            fout << query(a,b) << "\n";
        } else {
            fin >> a;
            fout << cautbin(a) << "\n";
        }

    }

    return 0;
}