Cod sursa(job #822001)

Utilizator toranagahVlad Badelita toranagah Data 22 noiembrie 2012 20:55:49
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream fin("biscuiti.in");
ofstream fout("biscuiti.out");
typedef long long int64;
const int MAX_N = 100100;
const int64 INF = 1 << 30;
int N;
int64 result;
int64 segTree[8 * MAX_N];
int64 needUpdate[8 * MAX_N];
void update(int nod, int lo, int hi, int a, int b, int val);
int query(int nod, int lo, int hi);
int delPos;

int main() {
	fin >> N;
	for (int i = 1; i <= N; ++i) {
        int x;
        fin >> x;
            update(1, 1, N, i, i, x);
            result -= x;
	}
	for (int t = 1; t <= N; ++t) {
		result += query(1, 1, N);
        update(1, 1, N, 1, delPos, t);
		//cerr << endl << segTree[1] << endl;
	}
	fout << result;
}

void update(int nod, int lo, int hi, int a, int b, int val) {
	if (lo >= a && hi <= b) {
		segTree[nod] += val;
		needUpdate[nod] += val;
	} else {
		int mid = lo + (hi - lo) / 2;
		if (a <= mid) {
			update(nod * 2, lo, mid, a, b,  val);
		}
		if (b > mid) {
			update(nod * 2 + 1, mid + 1, hi, a, b,  val);
		}
		segTree[nod] = min(segTree[nod*2], segTree[nod*2+1]);
	}
}

int query(int nod, int lo, int hi) {
	//cerr << lo << ' ' << hi << endl;
    segTree[nod*2] += needUpdate[nod];
    segTree[nod*2+1] += needUpdate[nod];
    needUpdate[nod*2] += needUpdate[nod];
    needUpdate[nod*2+1] += needUpdate[nod];
    needUpdate[nod] = 0;
	int result;
	if (lo == hi)  {
		//cerr << segTree[nod] << endl;
		result = segTree[nod];
		segTree[nod] = INF;
        delPos = lo;
		return result;
	} 
	int mid = lo + (hi - lo) / 2;
	if (segTree[nod*2] <= segTree[nod*2+1]) {
		result = query(nod * 2, lo, mid);
	} else {
		result = query(nod * 2 + 1, mid + 1, hi);
	}
	segTree[nod] = min(segTree[nod*2], segTree[nod*2+1]);
	return result;
}