Cod sursa(job #2839045)

Utilizator RK13Barbu Eduard RK13 Data 25 ianuarie 2022 10:31:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n,aib[100002],pi=1;

void update(int poz,int add)
{
    int i;
    for(i=poz;i<=n;i+=i&-i)
        aib[i]+=add;
}

int querysum(int poz)
{
    int sol=0,i;
    for(i=poz;i>=1;i-=i&-i)
        sol+=aib[i];
    return sol;
}

int solve(int suma)
{int p=pi,i=0;
bool ok=0;
while (p>=1) {if (aib[i+p]==suma) ok=1;
                else if (aib[i+p]<suma) {suma-=aib[i+p]; i+=p;}
                p/=2;
                while (p>=1 && i+p>n) p/=2;

             }
if (ok==1) return i+1;
    else return -1;
}


int main()
{int m,op,x,y,p;
f>>n>>m;
for (int i=1;i<=n;i++) {f>>x; update(i,x);}
while (pi<=n) pi*=2;
pi/=2;
for (int i=1;i<=m;i++) {f>>p;
                        if (p==0) {f>>x>>y; update(x,y);}
                        if (p==1) {f>>x>>y; g<<querysum(y)-querysum(x-1)<<'\n';}
                        if (p==2) {f>>x; g<<solve(x)<<'\n';}
                       }
}