Cod sursa(job #1633618)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 6 martie 2016 12:32:40
Problema Lupul Urias si Rau Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 5.01 kb
#include<stdio.h>

FILE *in, *out;

int n, i, colo, val, v[400001], maxuri[400001], minuri[400001], max, min, nextmax, nextmin, j, k , inter, mininter, startinter, dif1, dif2, start1, start2, lung1, lung2;

void searchmins()
{
    int val, start, lung;
    int i, j;
    val = -400000;
    minuri[nextmin] = n;
    for(i = 0; i <= nextmin - 1; i++) {
            for(j = minuri[i] + 1; j < minuri[i + 1]; j++) {
                    if((v[j] - v[minuri[i]] > val) && (j - minuri[i] <= (n / 2))) {
                            val = v[j] - v[minuri[i]];
                            start = minuri[i] + 1;
                            lung = j - start + 1;
                    }
            }
    }
    dif1 = val;
    start1 = start;
    lung1 = lung;
}

void searchmaxs()
{
    int val, start, lung;
    int i, j, next;
    val = -400000;
    next = nextmax - 1;
    for(i = maxuri[next] - 1; i >= 0; i--) {
            if(next > 0 && i == maxuri[next - 1]) {
                    next--;
            } else {
                if((max - v[i] > val) && (maxuri[next] - i <= (n / 2))) {
                        val = max - v[i];
                        start = i + 1;
                        lung = maxuri[next] - start + 1;
                }
            }
    }
    dif2 = val;
    start2 = start;
    lung2 = lung;
}
int main ()
{

    in = fopen("buline.in", "r");
    out = fopen("buline.out", "w");

    fscanf(in, "%d", &n);

    for(i = 1; i <= n; i++) {
            fscanf(in, "%d%d", &val, &colo);
            if(colo == 0) {
                v[i] = 0 - val;
            } else {
                v[i] = val;
            }
            v[i + n] = v[i];
    }
    v[2 * n] = 0;
    min = 2147483647;
    max = -2147483647;
    nextmax = 0;
    nextmin = 0;
    for(i = 1; i < 2 * n; i++) {
        v[i] = v[i] + v[i - 1];
    }
    n = 2 * n;
    /*
    for(i = 0; i <= n; i++) {
            printf("%d ", v[i]);
    }
    */
    for(i = 0; i < n; i++) {
            if(v[i] < min) {
                    min = v[i];
                    minuri[0] = i;
                    nextmin = 1;
            } else {
                if(v[i] == min) {
                        minuri[nextmin] = i;
                        nextmin++;
                } else {
                    if(v[i] > max) {
                            max = v[i];
                            maxuri[0] = i;
                            nextmax = 1;
                    } else {
                        if(v[i] == max) {
                                maxuri[nextmax] = i;
                                nextmax++;
                        }
                    }
                }
            }
    }
    /*
    printf("\n");
    for(i = 0; i < n; i++) {
            printf("%d ", maxuri[i]);
    }
    printf("\n");
    for(i = 0; i < n; i++) {
            printf("%d ", minuri[i]);
    }
    */
    mininter = 400000;
    j = 0;
    k = 0;
    for(i = 0; i < n; i++) {
            if(j != nextmin && i == minuri[j]) {
                    if(j >= 0 && j <= nextmin - 1) {
                            j++;
                    }
            }
            if(i == maxuri[k] && k != nextmax) {
                    //printf("GAY");
                    if(j >= 1) {
                        //printf("GAY");
                        inter = maxuri[k] - minuri[j - 1];
                        //printf("%d", inter);
                        if(inter < mininter && ((maxuri[k] - minuri[j - 1]) <= (n / 2))) {
                                mininter = inter;
                                startinter = minuri[j - 1] + 1;
                        }
                    }
                    if(k >= 0 && k <= nextmax - 1) {
                            k++;
                    }
            }
    }
    if(mininter == 400000) {
            //printf("HUEHUEHEUHEU");
            searchmins();
            searchmaxs();
            if(dif1 > dif2) {
                    fprintf(out, "%d %d %d", dif1, start1, lung1);
            } else {
                if(dif1 == dif2) {
                        if(start1 < start2) {
                                fprintf(out, "%d %d %d", dif1, start1, lung1);
                        } else {
                            if(start1 > start2) {
                                    fprintf(out, "%d %d %d", dif2, start2, lung2);
                            } else {
                                if(lung1 > lung2) {
                                        fprintf(out, "%d %d %d", dif2, start2, lung2);
                                } else {
                                    fprintf(out, "%d %d %d", dif1, start1, lung1);
                                }
                            }
                        }
                } else {
                    fprintf(out, "%d %d %d", dif2, start2, lung2);
                }
            }
    } else {
         fprintf(out, "%d %d %d ", max - min, startinter, mininter);
    }


    fclose(in);
    fclose(out);

    return 0;
}