Cod sursa(job #1538403)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 28 noiembrie 2015 22:51:49
Problema Schi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

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

const int LIM = 3e4 + 5;
const int NMax = 3 * LIM;
const int INF = 1e9;

int v[LIM];
int Aib[NMax], Lazy[NMax], From[NMax];

void BuildTree(int node, int lo, int hi){
    if(lo > hi) return;
    if(lo == hi){
        Aib[node] = v[lo];
        From[node] = lo;
        return;
    }
    int mid = (lo + hi) >> 1;
    BuildTree(node * 2, lo, mid);
    BuildTree(node * 2 + 1, mid + 1, hi);
    if(Aib[node * 2 + 1] <= Aib[node * 2]){
        From[node] = From[node * 2 + 1];
    } else {
        From[node] = From[node * 2];
    }
    Aib[node] = min(Aib[node * 2], Aib[node * 2 + 1]);
}

void Update(int node, int lo, int hi, int m, int M, int value){
    if(Lazy[node]){
        Aib[node] += Lazy[node];
        if(lo != hi){
            Lazy[node * 2] += Lazy[node];
            Lazy[node * 2 + 1] += Lazy[node];
        }
        Lazy[node] = 0;
    }
    if(lo > hi || lo > M || hi < m) return;
    if(lo >= m && hi <= M){
        Aib[node] += value;
        if(lo != hi){
            Lazy[node * 2] += value;
            Lazy[node * 2 + 1] += value;
        }
        return;
    }
    int mid = (lo + hi) >> 1;
    Update(node * 2, lo, mid, m, M, value);
    Update(node * 2 + 1, mid + 1, hi, m, M, value);
    if(Aib[node * 2 + 1] <= Aib[node * 2]){
        From[node] = From[node * 2 + 1];
    } else {
        From[node] = From[node * 2];
    }
    Aib[node] = min(Aib[node * 2], Aib[node * 2 + 1]);
}

int main(){
    int n;
    fin >> n;
    for(int i = 1; i <= n; i++) fin >> v[i];
    BuildTree(1, 1, n);
    for(int i = 1; i <= n; i++){
        fout << From[1] << "\n";
        Update(1, 1, n, 1, From[1] - 1, 1);
        Update(1, 1, n, From[1], From[1], INF);
    }
    return 0;
}