Cod sursa(job #1990261)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 11 iunie 2017 10:01:11
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int a[100001],n;


int Query(int poz)
{
int s=0;
for (int i=poz;i>=1;i -= i & -i)
        s += a[i];
return s;
}

void Update(int poz, int v)
{
for (int i=poz;i<=n; i += i & -i )
a[i] += v;
}

int Search(int p,int u,int x)
{
 int m;
 while (p<u)
    {
        m=(p+u)/2;
        int nr=Query(m);
        if (nr < x) p=m+1;
        if (nr >= x) u=m;
    }
m=(p+u)/2;
if(Query(m) < x) m++;
return m;
}

int main()
{
int v, m;
fi >> n >> m;
for ( int i = 1; i <= n; ++i )
    {
        fi >> v;
        Update(i, v);
    }
    int c, p1, p2, x;
    for ( int i = 1; i <= m; ++i )
    {
        fi >> c;
        if ( c==0 )
        {
            fi >> p1 >> v;
            Update(p1, v);
        }
        if (c==1)
        {
            fi >> p1 >> p2;
            fo << Query(p2) - Query(p1 - 1) << '\n';
        }
        if (c==2)
       {
           fi>>x;
           int sol=Search(1,n,x);
           if(Query(sol)==x) fo<<sol<<'\n';
                        else fo<<"-1";
       }
    }
return 0;
}