Cod sursa(job #3285378)

Utilizator Sorin_GabrielGabara Sorin Gabriel Sorin_Gabriel Data 12 martie 2025 19:48:11
Problema Arbori indexati binar Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <bits/stdc++.h>
#define VMAX 100005
#define INF 2000000000
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");


int numere[4*VMAX];
int nrr[VMAX];

void build(int st, int dr, int nr)
{
    if(st==dr)
    {
        numere[nr]=nrr[st];
        return;
    }
    int mij;
    mij=(st+dr)/2;
    build(st,mij,nr*2);
    build(mij+1,dr,nr*2+1);
    numere[nr]=numere[2*nr]+numere[2*nr+1];
}

void add_x(int poz, int st, int dr, int val, int nr)
{
    if(st==dr)
    {
        numere[nr]+=val;
        return;
    }
    int mij;
    mij=(st+dr)/2;
    if(poz<=mij)
        add_x(poz,st,mij,val,2*nr);
    else
        add_x(poz,mij+1,dr,val,2*nr+1);
    numere[nr]+=val;
}

int sum_interval(int s, int d, int st, int dr, int nr)
{
    if(st==dr)
        return numere[nr];
    int mij;
    mij = (st+dr)/2;
    int sum=0;
    if(s==st && mij<=d)
        sum+=numere[2*nr];
    else if(mij>=s)
        sum+=sum_interval(s,min(mij,d),st,mij,2*nr);
    if(s<=mij+1 && dr==d)
        sum+=numere[2*nr+1];
    else if(mij+1<=d)
        sum+=sum_interval(max(mij+1,s),d,mij+1,dr,2*nr+1);
    return sum;
}

int poz_min_sum(int st, int dr, int val, int nr)
{
    if(nr>=2*VMAX)
        return -1;
    if(numere[nr]==val)
        return dr;
    int mij=(st+dr)/2;

    if(val<=numere[2*nr])
        return poz_min_sum(st,mij,val,2*nr);
    else if(val>numere[2*nr] && val<numere[nr])
        return poz_min_sum(mij+1,dr,val-numere[2*nr],2*nr+1);
    else
        return -1;
}


int main()
{
    ios_base::sync_with_stdio(0);
    int n,m,i,j,k,t,q,nr,minim,maxim,suma;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>nrr[i];
    }

    build(1,n,1);

    for(i=0;i<m;i++)
    {
        fin>>j>>k;
        if(j==0)
        {
            fin>>t;
            add_x(k,1,n,t,1);
        }
        else if(j==1)
        {
            fin>>t;
            fout<<sum_interval(k,t,1,n,1)<<'\n';
        }
        else
            fout<<poz_min_sum(1,n,k,1)<<'\n';
    }




    return 0;
}