Cod sursa(job #3181642)

Utilizator rapidu36Victor Manz rapidu36 Data 7 decembrie 2023 16:00:17
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>

using namespace std;

const int N = 1e5;
const int L = 16;

unsigned int aib[N+1], v[N+1], n;

void actualizare(int i, int val)
{
    while (i <= n)
    {
        aib[i] += val;
        int p2 = i & (-i);
        i += p2;
    }
}

 long long interogare(int i)
 {
     long long sum = 0;
     while (i != 0)
     {
         sum += aib[i];
         int p2 = i & (-i);
         i -= p2;
     }
     return sum;
 }

 int cautare(unsigned int val)
 {
     int i = 0, pas = 1 << L;
     unsigned int copie_val = val;
     while (pas != 0)
     {
         if (i + pas <= n && aib[i+pas] < val)
         {
             i += pas;
             val -= aib[i];
         }
         pas /= 2;
     }
     if (interogare(i + 1) == copie_val)
     {
         return i + 1;
     }
     return -1;
 }

int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    int nq;
    in >> n >> nq;
    for (int i = 1; i <= n; i++)
    {
        in >> v[i];
        actualizare(i, v[i]);
    }
    for (int i = 0; i < nq; i++)
    {
        int tip;
        in >> tip;
        if (tip == 0)
        {
            int poz, val;
            in >> poz >> val;
            actualizare(poz, val);
        }
        else if (tip == 1)
        {
            int st, dr;
            in >> st >> dr;
            out << interogare(dr) - interogare(st - 1) << "\n";
        }
        else
        {
            unsigned int val;
            in >> val;
            out << cautare(val) << "\n";
        }
    }
    in.close();
    out.close();
    return 0;
}