Pagini recente » Cod sursa (job #851374) | Cod sursa (job #1960983) | Cod sursa (job #533291) | Cod sursa (job #3186101) | Cod sursa (job #600157)
Cod sursa(job #600157)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,a[100100],i,c,x,y,p;
void modifica(int p, int val)
{
while (p<=n)
a[p]+=val,
p+=(p ^ (p & (p-1)));
}
int suma(int p)
{
int t=0;
while (p>0)
t+=a[p],
p-=(p ^ (p & (p-1)));
return t;
}
int pozitia(int s)
{
int i=1,j=n,mij;
while (i!=j)
{
mij=(i+j)/2;
if (suma(mij)>=s) j=mij; else i=mij+1;
}
if (suma(i)==s) return i; else return -1;
}
/*int pozitia(int s)
{
int i=0,p;
for(p=1; p*2<=n; p*=2);
while (p>0 && s>0 && i<n)
{
while (i+p>n || a[i+p]>s) p/=2;
i+=p;
s-=a[i];
p/=2;
}
if (!s) return i; else return -1;
}*/
int main()
{
f >> n >> m;
fill_n(a,n+1,0);
for (i=1; i<=n; i++)
{
f >> x;
modifica(i,x);
}
for (i=m; i--;)
{
f >> c;
if (c<2)
{
f >> x >> y;
if (c) g << suma(y)-suma(x-1) << "\n";
else modifica(x,y);
} else
{
f >> x;
g << pozitia(x) << "\n";
}
}
return 0;
}