Cod sursă (job #145879)

Utilizator avatar AndreiRS Andrei-Rares Statescu AndreiRS IP ascuns
Problemă Lalele (clasele 9-10) Compilator cpp | 1,30 kb
Rundă Arhiva de probleme Status evaluat
Dată 12 mai 2015 18:22:39 Scor 100
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 5000000
int v[N],cont,split_pos;
int w[N];
void merge()
{
    int i = 0, j = split_pos+1, k = 0;

    while (i <= split_pos && j < cont)
        if (v[i] < v[j])
            w[k++] = v[i++];
        else
            w[k++] = v[j++];
    while (i <= split_pos)
        w[k++] = v[i++];
    while (j < cont)
        w[k++] = v[j++];

    for (int i = 0; i < cont; i++)
        v[i] = w[i];
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("lalele.in","r");
    fout=fopen("lalele.out","w");
    int n;
    fscanf(fin,"%d",&n);
    int i;
    for(i=0; i<n; i++)
    {
        int d,x;
        fscanf(fin,"%d%d",&d,&x);
        if(x!=0)
        {
            split_pos = cont-1;
            while(d)
            {
                v[cont++]=x-i;
                i++;
                d--;
            }

            for (int i = split_pos+1; i < split_pos+1 + (cont-split_pos-1)/2; i++)
                swap(v[i], v[cont-1-(i-(split_pos+1))]);

            merge();
        }
        else
            while(d)
            {
                cont/=2;
                fprintf(fout,"%d\n",i+v[cont]);
                i++;
                d--;
            }
        i--;
    }
    return 0;
}