Pagini recente » Cod sursa (job #2484715) | Cod sursa (job #659273) | Cod sursa (job #456710) | Cod sursa (job #2564596) | Cod sursa (job #3176797)
#include <fstream>
#include <vector>
using namespace std;
int putere_2(int n)
{
return (n & (-n));
}
void adauga(vector <int> &aib, int n, int p, int val)
{
while (p <= n)
{
aib[p] += val;
p += putere_2(p);
}
}
long long suma(vector <int> &aib, int p)
{
long long suma = 0;
while (p != 0)
{
suma += aib[p];
p -= putere_2(p);
}
return suma;
}
int poz_min(vector <int> &aib, int n, long long s)
{
int pas = 1 << 16, p = 0;
long long copie_s = s;
while (pas != 0)
{
if (p + pas <= n && aib[p + pas] < s)
{
s -= aib[p + pas];
p += pas;
}
pas /= 2;
}
///p = cea mai mare pozitie i cu propr. ca v[1]+v[2]+...+v[i] < copie_s
if (p < n && suma(aib, p + 1) == copie_s)
{
return p + 1;
}
return -1;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
int n, m;
in >> n >> m;
vector <int> aib(n + 1, 0);
for (int i = 1; i <= n; i++)
{
int val;
in >> val;
adauga(aib, n, i, val);
}
for (int i = 0; i < m; i++)
{
int tip;
in >> tip;
if (tip == 0)
{
int poz, val;
in >> poz >> val;
adauga(aib, n, poz, val);
}
else if (tip == 1)
{
int a, b;
in >> a >> b;
out << suma(aib, b) - suma(aib, a - 1) << "\n";
}
else
{
long long s;
in >> s;
out << poz_min(aib, n, s) << "\n";
}
}
in.close();
out.close();
return 0;
}