Pagini recente » Cod sursa (job #768307) | Cod sursa (job #2658233) | Cod sursa (job #36528) | Cod sursa (job #3264430) | Cod sursa (job #1267102)
#include <cstdio>
#include <vector>
int size;
std::vector<int> v;
void insert(int poz, int x)
{
for(; poz<v.size(); poz+= poz&(~(poz-1)))
{
v[poz]+=x;
}
}
int sum(int a, int b)
{
int s=0;
for(int poz = b;poz;poz-=poz&(~(poz-1)))
{
s+=v[poz];
}
for(int poz = a-1; poz; poz-=poz&(~(poz-1)))
{
s-=v[poz];
}
return s;
}
int main ()
{
FILE *fin=fopen("aib.in","r");
FILE *fout = fopen("aib.out","w");
int n, m;
fscanf(fin, "%d%d", &n, &m);
for (size = 1;size<=n;size*=2) {}
v.resize(size);
for(int i=1;i<=n;i++)
{
int temp;
fscanf(fin, "%d", &temp);
insert(i,temp);
}
int a,b,opt;
for(int i=1;i<=m;i++)
{
fscanf(fin,"%d", &opt);
if(opt==0)
{
fscanf(fin, "%d%d", &a, &b);
insert(a,b);
}
else if(opt==1)
{
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n",sum(a,b));
}
else
{
fscanf(fin, "%d", &a);
int poz= 1;
for(poz=1; 2*poz<=n && v[poz*2]<=a; poz*=2)
{
}
for(int pas = poz/2;pas;pas/=2)
{
if(poz+pas<=n and v[poz]+v[poz+pas]<=a)
{
poz+=pas;
}
}
fprintf(fout,"%d\n",poz);
}
}
return 0;
}