Untitled

 avatar
unknown
plain_text
a year ago
2.4 kB
1
Indexable
#include <iostream>
#include <set>
#include <unordered_map>
#include <vector>
using namespace std;
 
set <pair<int,int>> khoang_trong;
unordered_map<int, int> map_id;
vector<pair<int,int>> file[12005];
int cnt;
int n;
void init(int N) {
    for(int i=0;i<cnt;i++){
        file[i].clear();
    }
    cnt=0;
    map_id.clear();
    khoang_trong.clear();
    n=N;
    khoang_trong.insert(make_pair(1,N));
    return;
}
 
int add(int mId, int mSize) {
    if(n<mSize) return -1;
    map_id[mId]=cnt;
    int ans=khoang_trong.begin()->first;
    while(mSize>0){
        auto it=khoang_trong.begin();
        int st=(*it).first;
        int e=(*it).second;
        khoang_trong.erase(it);
        int vang=e-st+1;
        if(vang<mSize) {
            mSize-=vang;
            file[cnt].push_back(make_pair(st,e));
            n-=vang;
        }
        else if(vang==mSize){
            n-=vang;
            file[cnt].push_back(make_pair(st,e));
            break;
        }
        else{
            n-=mSize;
            file[cnt].push_back(make_pair(st,st+mSize-1));
            khoang_trong.insert(make_pair(st+mSize,e));
            break;
        }
    }
    cnt++;
    return ans;
}
 
int remove(int mId) {
    auto it=map_id.find(mId);
    int id=it->second;
    map_id.erase(it);
    int ans;
    ans=file[id].size();
    for(auto i:file[id]){
        int st=i.first;
        int e=i.second;
        n+=e-st+1;
        auto it1=khoang_trong.lower_bound(make_pair(st,e));
        auto it2=it1;
        if(it1!=khoang_trong.begin()){
            it2--;
            if(it2->second+1==st){
                st=it2->first;
                khoang_trong.erase(it2);
            }
        }
        if(it1!=khoang_trong.end()){
            if(e+1==it1->first){
                e=it1->second;
                khoang_trong.erase(it1);
            }
        }
        khoang_trong.insert(make_pair(st,e));
    }
    file[id].clear();
    map_id.erase(mId);
    return ans;
}
 
int count(int mStart, int mEnd) {
    int ans=0;
    for(int i=0; i<cnt;i++){
        if(!file[i].empty()){
            for(auto it:file[i]){
                if(it.second<mStart||it.first>mEnd) continue;
                ans++;
                break;
            }
        }
    }
    return ans;
}