Cod sursa(job #2123658)

Utilizator giotoPopescu Ioan gioto Data 6 februarie 2018 14:45:25
Problema Taramul Nicaieri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

int n;
int x[105], y[105], pos[105];
int w[105], k[105];
inline bool cmp1(int i, int j){
    return x[i] < x[j];
}
inline bool cmp2(int i, int j){
    return y[i] < y[j];
}
priority_queue <pair <int, int> > pq;
int main()
{
    freopen("harta.in", "r", stdin);
    freopen("harta.out", "w", stdout);
    scanf("%d", &n);
    int Sol = 0;
    for(int i = 1; i <= n ; ++i){
        scanf("%d%d", &x[i], &y[i]);
        Sol += x[i];
        pos[i] = i;
        pq.push({y[i], i});
    }
    printf("%d\n", Sol);
    sort(pos + 1, pos + n + 1, cmp1);
    for(int i = 1; i <= n ; ++i){
        int NR = 0;
        while(x[pos[i]] > 0){
            int nr = pq.top().first, nod = pq.top().second;
            pq.pop();
            if(nr > 1){
                w[++NR] = nod;
                k[NR] = nr - 1;
            }
            if(nod == pos[i]) continue ;
            --x[pos[i]];
            printf("%d %d\n", pos[i], nod);
        }
        for(int i = 1; i <= NR ; ++i)
            pq.push({k[i], w[i]});
    }
    return 0;
}