Cod sursa(job #2552129)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 20 februarie 2020 16:43:40
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int n,m,x,y,a,ai[1<<19];

void Build(int nod,int st,int dr)
{   if(st==dr)
    {   f>>ai[nod];
        return;
    }
    int mij=(st+dr)/2;
    Build(2*nod,st,mij);
    Build(2*nod+1,mij+1,dr);
    ai[nod]=ai[2*nod]+ai[2*nod+1];
}

void Update(int nod,int st,int dr)
{   if(st==dr)
    {   ai[nod]+=y;
        return;
    }
    int mij=(st+dr)/2;
    if(x<=mij)
        Update(2*nod,st,mij);
    if(mij<x)
        Update(2*nod+1,mij+1,dr);
    ai[nod]=ai[2*nod]+ai[2*nod+1];
}

int Query(int nod,int st,int dr)
{   if(st>=x && dr<=y)
        return ai[nod];
    int mij=(st+dr)/2,sumSt,sumDr;
    sumSt=sumDr=0;
    if(x<=mij)
        sumSt=Query(2*nod,st,mij);
    if(mij<y)
        sumDr=Query(2*nod+1,mij+1,dr);
    return sumSt+sumDr;
}

int CautBin()
{   int st=1,dr=n;
    while(st<=dr)
    {   int mij=(st+dr)/2;
        x=1; y=mij;
        int sum=Query(1,1,n);
        if(sum==a)
            return mij;
        else
        if(sum<a)
            st=mij+1;
        else
            dr=mij-1;
    }
    return -1;
}

int main()
{   f>>n>>m;
    Build(1,1,n);
    for(int t; m; m--)
    {   f>>t;
        if(t==2)
        {   f>>a;
            g<<CautBin()<<'\n';
        }
        else
        {   f>>x>>y;
            if(!t)
                Update(1,1,n);
            else
                g<<Query(1,1,n)<<'\n';
        }
    }
    g.close(); f.close(); return 0;
}