Cod sursa(job #1788791)

Utilizator razvanlgu31Razvan Lungu razvanlgu31 Data 26 octombrie 2016 14:42:36
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.15 kb
//#include <fstream>
//
//using namespace std;
//ifstream fin("aint.in");
//ofstream fout("aint.out");
//int v[450010],x,y,p,i,Min,n,m,Max,a[16000];
//void update(int nod,int s,int d)
//{
//    if(s==d)
//    {
//        v[nod]=y;
//        return;
//    }
//    else
//    {
//        int m=(s+d)/2;
//        if(x<=m)
//            update(2*nod,s,m);
//        else
//            update(2*nod+1,m+1,d);
//
//        v[nod]=v[2*nod+1]+v[2*nod];
//    }
//}
//void query(int nod,int s,int d)
//{
//    if(x<=s && y>=d)
//    {
//        Max+=v[nod];
//    }
//    else
//    {
//        int m=(s+d)/2;
//        if(x<=m)
//            query(2*nod,s,m);
//        if(y>=m+1)
//            query(2*nod+1,m+1,d);
//
//    }
//}
//int main()
//{
//    fin>>n>>m;
//    for(i=1; i<=n; i++)
//    {
//        fin>>a[i];
//        y=a[i];
//        x=i;
//        update(1,1,n);
//    }
//    for(i=1; i<=m; i++)
//    {
//        fin>>p>>x>>y;
//        if(p==0)
//        {
//            y=a[x]-y;
//            update(1,1,n);
//        }
//        else
//        {
//            Max=0;
//            query(1,1,n);
//            fout<<Max<<'\n';
//        }
//    }
//    for(i=1;i<=15;i++)
//    {
//        fout<<i<<" "<<v[i]<<'\n';
//    }
//    return 0;
//}
#include <iostream>
#include <fstream>

using namespace std;

const int MAX_N = 15001, MAX_LEN = 300020;
int N, M;

int v[MAX_N]; //datoriile initiale
int tree[MAX_LEN]; //arbore de intervale

int sum; //variabila in care retin


void build_tree(int start, int end, int node) {
    if (start == end) {
        tree[node] = v[start];
    } else {
        int midd = start + (end - start) / 2;
        build_tree(start, midd, 2 * node);
        build_tree(midd + 1, end, 2 * node + 1);

        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }
}


void update_query(int start, int end, int node, int day, int value) {
    if (start == end) {
        tree[node] -= value;
    } else {

        int midd = start + (end - start) / 2;
        if (day <= midd) update_query(start, midd, 2 * node, day, value);
        else update_query(midd + 1, end, 2 * node + 1, day, value);


        tree[node] -= value;
    }
}

void sum_query(int start, int end, int node, int f_day, int l_day) {

    if (f_day <= start  && end <= l_day) {
        sum += tree[node];
    } else {

        int midd = start + (end - start) / 2;
        if (f_day <= midd) sum_query(start, midd, 2 * node, f_day, l_day);
        if (l_day > midd) sum_query(midd + 1, end, 2 * node + 1, f_day, l_day);

    }

}


int main() {

    ifstream fin("datorii.in");
    ofstream fout("datorii.out");

    fin >> N >> M;
    for (int i = 1; i <= N; i++) {
        fin >> v[i];
    }


    build_tree(1, N, 1);

    int type, x, y;
    for (int i = 1; i <= M; i++) {
        fin >> type >> x >> y;

        if (type == 0) {
            update_query(1, N, 1, x, y);
        } else {
            sum = 0;
            sum_query(1, N, 1, x, y);
            fout << sum << '\n';
        }

    }



    fin.close();
    fout.close();


    return 0;
}