Pagini recente » Cod sursa (job #493118) | Cod sursa (job #2617634) | Cod sursa (job #2976942) | Cod sursa (job #488267) | Cod sursa (job #63911)
Cod sursa(job #63911)
// Arbori indexati binar
// Complexitate m*log n cu optimizari + calcul integral pe biti
using namespace std;
#define MAX_N 1<<13
#include<stdio.h>
FILE *fin=fopen("datorii.in","r"),
*fout=fopen("datorii.out","w");
int a[MAX_N<<1],c[MAX_N<<1];
int n,m,i,SUM,k;
void buildtree(void) //construiesc arborele
{
int i,p;
for (i=1; i<=n; i++) {
p=i^(i&(i-1)); c[i]=a[i]-a[i-p]; }
}
void update(int a, int b) //actualizare in log n
{
int p=0;
while (a<=n) {
c[a]-=b; p=a^(a&(a-1));
a+=p; }
}
void query(int a, int b) // determin in max(log n) suma in intervalul (a,b)
{
int p=0,a1=a-1,b1=b;
int sa=0,sb=0;
while (a1>0) {
sa+=c[a1]; p=a1^(a1&(a1-1));
a1-=p; }
p=0;
while (b1>0) {
sb+=c[b1]; p=b1^(b1&(b1-1));
b1-=p; }
SUM=sb-sa;
}
int main()
{
fscanf(fin,"%d %d",&n,&m);
for (i=1; i<=n; i++)
{
fscanf(fin,"%d",&k);
a[i]=a[i-1]+k;
}
buildtree();
int t,a,b;
for (i=1; i<=m; i++)
{
fscanf(fin,"%d %d %d",&t,&a,&b);
if (t==0) update(a,b);
else
{
query(a,b);
fprintf(fout,"%d\n",SUM);
}
}
fclose(fin); fclose(fout);
return 0;
}