Pagini recente » Cod sursa (job #732950) | Cod sursa (job #28314) | Cod sursa (job #1314495) | Cod sursa (job #876746) | Cod sursa (job #1792428)
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out("aib.out");
int aib[100007], n , Log;
void aibUpdate(int i, int s)
{
for(; i <= n; i+= i & (-i))
aib[i]+= s;
}
int aibQuery(int i)
{
int s = 0;
for(; i >= 1; i-= i & (-i))
s+= aib[i];
return s;
}
int cautBin(int s)
{
int poz = 0;
for(int i = Log; i >= 0; --i)
{
if((poz + (1 << i)) <= n && aib[poz + (1 << i)] < s)
{
poz+= 1 << i;
s-= aib[poz];
}
}
return poz + 1;
}
int main()
{
int m, tp, a, b;
in >> n >> m;
for(Log = 1; (1 << Log) <= n; ++Log);
--Log;
for(int i = 1; i <= n; ++i)
{
in >> a;
aibUpdate(i, a);
}
for(int i = 1; i <= m; ++i)
{
in >> tp;
if(tp == 0)
{
in >> a >> b;
aibUpdate(a, b);
}
else if(tp == 1)
{
in >> a >> b;
out << aibQuery(b) - aibQuery(a - 1) << "\n";
}
else
{
in >> a;
int poz = cautBin(a);
if(aibQuery(poz) == a)
out << poz << "\n";
else out << "-1" << "\n";
}
}
}