Cod sursa(job #1418881)

Utilizator figure0907Andrei Gonczi figure0907 Data 14 aprilie 2015 12:15:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define maxn 15001
#define maxm 100001

struct trip
{
    bool t;
    int x, y;
};

int n,m,i,p;
int a[maxn];
int v[2*maxn];
trip q[maxn];

void readdata()
{
    FILE *f = fopen("datorii.in","rt");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&q[i].t,&q[i].x,&q[i].y);
    }
    fclose(f);
}

int build_bin(int i)
{
    if (i>=p)
    {
        v[i]=a[i-p+1];
        return a[i-p+1];
    }
    v[i]=build_bin(2*i)+build_bin(2*i+1);
    return v[i];
}

int get_val(int x, int y)
{
    int q=p,t,poz,st=0,dr=0;

    while (q<x)
    {
        t=1;
        while (q+2*t<x)
        {
            t*=2;
        }
        st += v[q/t];
        q+=t;
    }

    q=p+n-1;
    while (q>y)
    {
        t=1;
        while (q-2*t>y)
        {
            t*=2;
        }
        dr += v[q/t];
        q-=t;
    }
    printf("%d\n",dr);

    return v[1]-st-dr;
}

void mod_val(int x, int y)
{
    while (x>0)
    {
        v[x]-=y;
        x/=2;
    }
}

int solve()
{
    p=1;
    while (p<n) p*=2;
    build_bin(1);
    return 0;
}

void writedata()
{
    FILE *f = fopen("datorii.out","wt");
    for (i=1;i<=m;i++)
    {
        if (q[i].t)
        {
            fprintf(f,"%d\n",get_val(q[i].x+p-1,q[i].y+p-1));
        }
        else
        {
            mod_val(q[i].x+p-1,q[i].y);
        }
    }
    fprintf(f,"\n");
    fclose(f);
}

int main()
{
    readdata();
    solve();
    writedata();

    return 0;
}