Pagini recente » Cod sursa (job #2485284) | Cod sursa (job #1947563) | Cod sursa (job #688192) | Cod sursa (job #635820) | Cod sursa (job #2356406)
#include <iostream>
#include <fstream>
#define NMAX 100005
std::ifstream in("aib.in");
std::ofstream out("aib.out");
using namespace std;
int sir[NMAX] , aib[NMAX];
int N,intrebari;
void adaugare(int poz , int val)
{
for(int i = poz ; i<=N ; i += (i)&(-i))
{
aib[i] += val;
}
}
int sum(int poz)
{
int sol = 0;
for(int i = poz ; i>0 ; i -= (i)&(-i))
{
sol += aib[i];
}
return sol;
}
int caut_bin(int cautat)
{
int poz = 0;
for(long long i = (1<<30) ; i>0 ; i=i>>1)
{
if(poz + i <= N)
{
if(sum(poz+i) <= cautat)
{
poz += i ;
}
}
}
if(aib[poz] != cautat)
return -1;
return poz;
}
int tip , b;
int a;
int main()
{
in>>N>>intrebari;
for(int i=1; i<=N ; i++)
{
in>>sir[i];
}
for(int i = 1 ;i<=N ; i++)
{
for(int j = i ; j<=N ; j +=(j)&(-j))
{
aib[j] += sir[i];
}
}
for(int i = 1 ; i<= intrebari ; i++)
{
in>>tip;
if(tip != 2)
{
in>> a >> b;
if(tip == 0 )
{
adaugare(a,b);
}
else
{
out<<sum(b) - sum(a-1)<<"\n";
}
}
else
{
in >> a;
out<<caut_bin(a)<<"\n";
}
}
return 0;
}