Pagini recente » Cod sursa (job #2576888) | Cod sursa (job #2964070) | Cod sursa (job #52334) | Clasamentul arhivei de probleme | Cod sursa (job #2498282)
#include <iostream>
#include <fstream>
#define DEBUG 0
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100100], n;
void update(int val, int poz)
{
for(int i = poz; i <= n; i += i&(-i))
aib[i] += val;
}
int query(int poz)
{
int s = 0;
for(int i = poz; i; i -= i&(-i))
s += aib[i];
return s;
}
int binarySearch(int sum)
{
int l = 1, r = n, x = n, rez = n+1;
bool ok = 1;
if(query(n) == sum)
{
rez = n;
ok = 0;
}
while(x && ok)
{
x = (l+r) >> 1;
int aux = query(x);
if(aux == sum)
{
rez = x;
break;
}
else
{
if(aux > sum)
r = x;
else
l = x;
if(DEBUG)
cout << "l:" << l << " r:" << r << '\n' << '\n';
}
if(l == r)
break;
}
if(rez == n+1)
return -1;
return rez;
}
int main()
{
int m;
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
update(x, i);
}
if(DEBUG)
{
for(int i = 1; i <= n; i++)
cout << aib[i] << ' ';
cout << "\n\n\n";
cout << query(n) << '\n';
cout << binarySearch(90) << ' ' << binarySearch(25) << '\n';
cout << binarySearch(229);
}
while(m)
{
int aux, x, y;
in >> aux >> x;
if(aux == 1)
{
in >> y;
out << query(y) - query(x-1) << '\n';
}
else
{
if(aux == 0)
{
in >> y;
update(y, x);
}
else
out << binarySearch(x) << '\n';
}
m--;
}
return 0;
}