Cod sursa(job #2549397)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 17 februarie 2020 17:31:42
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <fstream>
#include <queue>
using namespace std;

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

const int NMAX=100010;

int n,m;
int v[NMAX];
int arb[5*NMAX];
struct INTERVAL{
    int st,dr;
}interval[5*NMAX];

void citire()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++)
        fin>>v[i];
}
void construireArbore(int rad, int st, int dr)
{
    if (st==dr){
        interval[rad].st=st;
        interval[rad].dr=dr;
        arb[rad]=v[st];
    }else{
        int mij=(st+dr)/2;
        interval[rad].st=st;
        interval[rad].dr=dr;
        construireArbore(2*rad,st,mij);
        construireArbore(2*rad+1,mij+1,dr);
        arb[rad]=arb[2*rad]+arb[2*rad+1];
    }
}
void update(int rad, int a, int b)
{
    if (interval[rad].st==interval[rad].dr && interval[rad].st==a){
        arb[rad]+=b;
        v[a]+=b;
    }else if (interval[rad].st<=a && interval[rad].dr>=a){
        update(2*rad,a,b);
        update(2*rad+1,a,b);
        arb[rad]=arb[2*rad]+arb[2*rad+1];
    }
}
int query(int rad, int st, int dr)
{
    if (interval[rad].st>=st && interval[rad].dr<=dr){
        return arb[rad];
    }else if (interval[rad].st>dr || interval[rad].dr<st){
        return 0;
    }else{
        return query(2*rad,st,dr)+query(2*rad+1,st,dr);
    }
}
int tipul2(int a)
{
    int st=1,dr=n;
    int q,mij;
    while (st<=dr){
        mij=(st+dr)/2;
        q=query(1,1,mij);
        if (q<a){
            st=mij+1;
        }else if (q>a){
            dr=mij-1;
        }else{
            return mij;
        }
    }
    return -1;
}
void rezolvare()
{
    int a,b,c;
    for (int i=1; i<=m; i++){
        fin>>c>>a;
        if (c<2)
            fin>>b;
        switch (c){
            case 0:
                update(1,a,b);
                break;
            case 1:
                fout<<query(1,a,b)<<'\n';
                break;
            case 2:
                fout<<tipul2(a)<<'\n';
                break;
        }
    }
}
void BFS(int rad)
{
    queue<int>q;
    q.push(rad);
    int k;
    while (!q.empty()){
        k=q.front();
        q.pop();
        if (interval[k].st!=0){
            fout<<interval[k].st<<' '<<interval[k].dr<<' '<<arb[k]<<'\n';
            q.push(2*k);
            q.push(2*k+1);
        }
    }
}
int main()
{
    citire();
    construireArbore(1,1,n);
    rezolvare();
    //BFS(1);
    fin.close();
    fout.close();
    return 0;
}