Cod sursa(job #3232710)

Utilizator iulia_morariuIulia Morariu iulia_morariu Data 1 iunie 2024 10:05:58
Problema Stergeri Scor 30
Compilator cpp-64 Status done
Runda Simulare E4 #1 Marime 2.61 kb
#include <iostream>
#include <fstream>
#include <vector>
//#include <bits/stdc++.h>

using namespace std;

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

int st[4 * 1000001];
int lz[2 * 1000001];

void lazy(int l, int r, int p){
    st[p] = max(0, st[p] + lz[p] * (r - l + 1));
    if(l != r){
        lz[p * 2] += lz[p];
        lz[p * 2 + 1] += lz[p];
    }
    lz[p] = 0;
}

void build(int l, int r, int p){
    if(l == r){
        st[p] = 1;
        return;
    }

    int m = (l + r) / 2;
    build(l, m, p * 2);
    build(m + 1, r, p * 2 + 1);

    st[p] = st[p * 2 + 1] + st[p * 2];
}

int query(int l, int r, int p, int l1, int r1){
    if(l1 > r1) return 0;
    lazy(l, r, p);
    if(l == l1 && r == r1){
        return st[p];
    }

    int m = (l + r) / 2;
    return query(l, m, p * 2, l1, min(m, r1)) + 
    query(m + 1, r, p * 2 + 1, max(l1, m + 1), r1);
}

void update(int l, int r, int p, int l1, int r1, int val){
    if(l1 > r1) return;
    //cout << "l = " << l << " r = " << r << " l1 = " << l1 << " r1 = " << r1 << '\n';
    if(l1 == l && r1 == r){
        lz[p] += val;
        lazy(l, r, p);
        return;
    }

    int m = (l + r) / 2;
    update(l, m, p * 2, l1, min(r1, m), val);
    update(m + 1, r, p * 2 + 1, max(l1, m + 1), r1, val);
    st[p] = st[p * 2] + st[p * 2 + 1];

    //cout << "l = " << l << " r = " << r << " st[p] = " << st[p] << '\n';
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, qq, k; fin >> n >> qq >> k;

    build(1, n, 1);
    for(int ii = 0; ii < qq; ii++){
        int l, r; fin >> l >> r;
        int l1 = 1, r1 = n;
        int p1 = l;
        while(l1 <= r1){
            int m = (l1 + r1) / 2;
            int cnt = query(1, n, 1, 1, m);

            if(cnt >= l){
                p1 = m;
                r1 = m - 1;
            }else l1 = m + 1;
        }

        l1 = 1, r1 = n;
        int p2 = r;
        while(l1 <= r1){
            int m = (l1 + r1) / 2;
            int cnt = query(1, n, 1, 1, m);
            //cout << "m = " << m << " cnt = " << cnt << '\n';

            if(cnt >= r){
                p2 = m;
                r1 = m - 1;
            }else l1 = m + 1;
        }

        //cout << "( " << l << " , " << r << " ) --- > ( " << p1 << " , " << p2 << " )\n";

        update(1, n, 1, p1, p2, -1);
    }

    int l1 = 1, r1 = n;
    int p = k;
    while(l1 <= r1){
        int m = (l1 + r1) / 2;
        int cnt = query(1, n, 1, 1, m);
        //cout << "m = " << m << " cnt = " << cnt << '\n';

        if(cnt >= k){
            p = m;
            r1 = m - 1;
        }else l1 = m + 1;
    }

    fout << p << '\n';

    return 0;
}