Pagini recente » Cod sursa (job #2978986) | Cod sursa (job #2598401) | Cod sursa (job #167355) | Cod sursa (job #1062806) | Cod sursa (job #767408)
Cod sursa(job #767408)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
vector<int> aib;
int get(int a,int b)
{
int k = b;
int sum=0;
while (k>0)
{
sum+=aib[k];
k -= k&(-k);
}
if (a==1) return sum;
k = a-1;
while (k>0)
{
sum -= aib[k];
k -= k&(-k);
}
return sum;
}
void set(int x,int val)
{
int k=x;
while (k<aib.size())
{
aib[k]+=val;
k+=k&(-k);
}
}
int getpos(int sum)
{
int ind = aib.size()/2;
int incr = aib.size()/4;
bool found = false;
int savedsum =sum;
while (!found)
{
if (aib[ind]<sum){
sum -=aib[ind];
ind +=incr;
}
else
if (aib[ind]>sum)
ind-=incr;
else {found=true;return ind;}
if (incr==0 && !found)
return -1;
incr/=2;
}
if (!found)
return -1;
/*int res;
do{
ind--;
res=get(1,ind);
}while (res==savedsum);*/
return ind;
}
int main()
{
FILE *f =fopen("aib.in","r");
FILE *g =fopen("aib.out","w+");
int n,m;
fscanf(f,"%d %d",&n,&m);
int dim =1;
while (dim <= n) dim <<= 1;
aib.resize(dim);
int x;
for (int i=1;i<=n;i++)
{
fscanf(f,"%d", &x);
set(i,x);
}
for (int i=0;i<m;i++)
{
int op,a,b,res;
fscanf(f,"%d",&op);
switch(op){
case 0:
fscanf(f,"%d %d",&a,&b);
set(a,b);
break;
case 1:
fscanf(f,"%d %d",&a,&b);
res = get(a,b);
fprintf(g,"%d\n",res);
break;
case 2:
fscanf(f,"%d",&a);
res = getpos(a);
if (res==1008)
{
res = res+1;
}
fprintf(g,"%d\n",res);
break;
default:
break;
}
}
fclose(f);
fclose(g);
}