Pagini recente » Cod sursa (job #2661288) | Cod sursa (job #1860277) | Cod sursa (job #1785290) | Cod sursa (job #2199295) | Cod sursa (job #2356428)
#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;
int valoare_cautata = cautat;
for(long long i = (1<<30) ; i>0 ; i=i>>1)
{
if(i + poz <= N)
{
if(aib[poz+i] <= valoare_cautata)
{
valoare_cautata -=aib[poz+i];
poz += i;
if(valoare_cautata == 0)
{
return poz;
}
}
}
}
return -1;
}
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;
}