Cod sursa(job #2738863)

Utilizator grezdeCristian Ardeleanu grezde Data 6 aprilie 2021 14:32:32
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>

using namespace std;

const int MAXPN = 131072;
int n, m, pn;
int st, dr;
int a[2*MAXPN+2];

int query(int i, int start, int end) {
    if(st <= start && dr >= end)
        return a[i];
    int um = (start+end)/2;
    if(dr <= um)
        return query(2*i, start, um);
    if(st > um)
        return query(2*i+1, um+1, end);
    return query(2*i, start, um) + query(2*i+1, um+1, end);
}

int sumTo(int i) {
    st = 1;
    dr = i;
    return query(1, 1, pn);
}

int main()
{
    FILE* fin = fopen("aib.in", "r");
    FILE* fout = fopen("aib.out", "w");
    fscanf(fin, "%d %d", &n, &m);
    int aux = n;
    pn = 1;
    while(aux > 0) {
        aux >>= 1;
        pn <<= 1;
    }
    if(pn == 2*n)
        pn = n;
    
    for(int i=pn; i<pn+n; i++)
        fscanf(fin, "%d", &a[i]);
    for(int i=pn-1; i>0; i--)
        a[i] = a[2*i]+a[2*i+1];
    
    int x, xa, xb;
    for(int i=1; i<=m; i++) {
        fscanf(fin, "%d %d", &x, &xa);
        if(x < 2)
            fscanf(fin, "%d", &xb);

        if(x == 0)
            for(xa = pn+xa-1; xa > 0; xa /= 2)
                a[xa] += xb;
        if(x == 1) {
            st = xa; dr = xb;
            fprintf(fout, "%d\n", query(1, 1, pn));
        }
        if(x == 2) {
            int l=1, r=n, mid, val;
            while(l < r) {
                mid = (l+r)/2;
                val = sumTo(mid);
                if(val < xa)
                    l = mid+1;
                else
                    r = mid;
            }
            fprintf(fout, "%d\n", sumTo(l) == xa ? l : -1);
        }
    }
    
    return 0;
}