Cod sursa(job #2528935)

Utilizator ianiIani Biro iani Data 22 ianuarie 2020 19:26:20
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int tree[100005],n;

void addvalue(int index,int val)
{
    for (int i=index;i<=n;i=i+(i&(-i)))
        tree[i]+=val;
}

int calcularesuma(int a,int b)
{
    int suma1a=0,suma1b=0;
    for (int i=b;i>=1;i=i-(i&(-i)))
        suma1b+=tree[i];
    for (int i=a-1;i>=1;i=i-(i&(-i)))
        suma1a+=tree[i];
    return suma1b-suma1a;
}

int pozmink(int a)
{
    int st=1,dr=min(a,n);
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        int val=calcularesuma(1, mij);
        if (val==a)
            return mij;
        else if (val>a)
            dr=mij-1;
        else if (val<a)
            st=mij+1;
    }
    return -1;
}

int main()
{
    int m;
    fin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        int x;
        fin>>x;
        addvalue(i, x);
    }
    for (int i=1;i<=m;i++)
    {
        char c;
        fin>>c;
        switch(c)
        {
            case('0'):
            {
                int x,y;
                fin>>x>>y;
                addvalue(x, y);
                break;
            }
            case('1'):
            {
                int x,y;
                fin>>x>>y;
                fout<<calcularesuma(x, y)<<'\n';
                break;
            }
            case('2'):
            {
                int x;
                fin>>x;
                fout<<pozmink(x)<<'\n';
                break;
            }
        }
    }
    return 0;
}