Cod sursa(job #2312610)

Utilizator miruna1224Floroiu Miruna miruna1224 Data 5 ianuarie 2019 04:06:37
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>

using namespace std;

const int N = 15001;
const int M = 100001;

int AI[M], *v, n, x, y, m;

void Create (int poz, int st, int dr)
{
    if(st == dr)
    {
        AI[poz] = v[st];
        return;
    }

    int m = ( st + dr ) / 2;

    Create(2 * poz, st, m);
    Create(2 * poz + 1, m + 1, dr);

//    if(v[AI[2 * x]] > v[AI[2 * x + 1]])
//        AI[x] = AI[2 * x + 1];
//    else
//        AI[x] = AI[2 * x ];

    AI[poz] = AI[2 * poz] + AI[2 * poz + 1];
}

void Update ( int st, int dr, int poz )
{
    if(st == dr)
    {
        AI[poz] -= y;
        return;
    }
    int m = (st + dr) / 2;
    if(x <= m)
        Update( st, m, 2 * poz);
    else
        Update( m + 1, dr, 2 * poz + 1);
    AI[poz] = AI[2 * poz] + AI[2 * poz + 1];
}

void Query(int poz, int st, int dr, int &sol)
{
    if(x <= st && dr <= y)
    {
        sol += AI[poz];
        return;
    }
    int m = (st + dr) / 2;
    if(x <= m)
        Query(2 * poz, st, m, sol);
    if(y > m)
        Query(2 * poz +1, m + 1, dr, sol);
}


int main()
{
    int i, task, sol;

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

    in >> n >> m;

    v = new int [n + 1];

    for( i = 1; i <= n; i++ )
        in >> v[i];

    Create(1, 1, n);

    for ( i = 0; i < m ; i++ )
    {
        in >> task >> x >> y;
        if(task == 0)
            Update( 1, n, 1);
        else
        {
            sol = 0;
            Query(1, 1, n, sol);
            out << sol << "\n";
        }

    }

    in.close();
    out.close();

    delete ( v );

    return 0;
}