Cod sursa(job #1849305)

Utilizator DobosDobos Paul Dobos Data 17 ianuarie 2017 11:51:32
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <bits/stdc++.h>
#define NMAX 1000005
#define INF 1e9
using namespace std;

ifstream fin("eliminare.in");
ofstream fout("eliminare.out");
struct sol{
    int s,p,l;
};
sol V[4 * NMAX];
int S[NMAX];
bitset < NMAX > B;

inline void buildtree(int nod,int L,int R){
    if(L == R){
        V[nod].s = S[L];
        V[nod].p = L;
        return;
    }
    int mid = (L + R) / 2;

    buildtree(2 * nod,L,mid);
    buildtree(2 * nod + 1,mid + 1,R);
        if(V[2 * nod].s >= V[2 * nod + 1].s)
            V[nod].s = V[2 * nod].s,V[nod].p = V[2 * nod].p;
        else
            V[nod].s = V[2 * nod + 1].s,V[nod].p = V[2 * nod + 1].p;

}

inline void Search(int nod,int L,int R,int m,int M,int &p,int &mx){
    if(V[nod].l){
        V[nod].s += V[nod].l;
        if(L != R){
            V[2 * nod].l += V[nod].l;
            V[2 * nod + 1].l += V[nod].l;
        }
        V[nod].l = 0;
    }
    if(L > R)
        return;
    if(L >= m && R <= M){
        if(mx < V[nod].s){
            mx = V[nod].s;
            p = nod;
        }
        return;
    }
    int mid = (L + R)/2;
    if(mid >= m)
        Search(2 * nod,L,mid,m,M,p,mx);
    if(mid < M)
        Search(2 * nod + 1,mid + 1,R,m,M,p,mx);

}
inline void update(int nod,int L,int R,int p){
    if(V[nod].l){
        V[nod].s += V[nod].l;
        if(L != R){
            V[2 * nod].l += V[nod].l;
            V[2 * nod + 1].l += V[nod].l;
        }
        V[nod].l = 0;
    }
    if(L == R){
        V[nod].s = -INF;
        return;
    }
    int mid = (L + R)/2;

    if(mid >= p)
        update(2 * nod,L,mid,p);
    else
        update(2 * nod + 1,mid + 1,R,p);

    if(V[2 * nod].s >= V[2 * nod + 1].s)
        V[nod].s = V[2 * nod].s,V[nod].p = V[2 * nod].p;
    else
        V[nod].s = V[2 * nod + 1].s,V[nod].p = V[2 * nod + 1].p;

}

inline void solve(int nod,int L,int R){
    if(V[nod].l){
        V[nod].s += V[nod].l;
        if(L != R){
            V[2 * nod].l += V[nod].l;
            V[2 * nod + 1].l += V[nod].l;
        }
        V[nod].l = 0;
    }
    if(L == R){
        if(V[nod].s > -INF)
            fout << V[nod].s << " ";
        return;
    }
    int mid = (L + R) / 2;

    buildtree(2 * nod,L,mid);
    buildtree(2 * nod + 1,mid + 1,R);


}


inline void lazyupdate(int nod,int L,int R,int m,int M,int c){
    if(L > R)
        return;
    if(V[nod].l){
        V[nod].s += V[nod].l;
        if(L != R){
            V[2 * nod].l += V[nod].l;
            V[2 * nod + 1].l += V[nod].l;
        }
        V[nod].l = 0;
    }
    if(R >= m && L <= M){
        V[nod].s += c;
        if(L != R){
            V[2 * nod].l += c;
            V[2 * nod + 1].l += c;
        }
        return;
    }
    int mid = (R + L) / 2;
    if(mid >= m)
        lazyupdate(2 * nod,L,mid,m,M,c);
    if(mid < M)
        lazyupdate(2 * nod + 1,mid + 1,R,m,M,c);

    if(V[2 * nod].s >= V[2 * nod + 1].s)
        V[nod].s = V[2 * nod].s,V[nod].p = V[2 * nod].p;
    else
        V[nod].s = V[2 * nod + 1].s,V[nod].p = V[2 * nod + 1].p;
}

int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    int n,m,p,x,y,mx;
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
        fin >> S[i];
    buildtree(1,1,n);

    for(int i = 1; i <= m; i++){
        fin >> x >> y;
        mx = -INF;
        Search(1,1,n,x,y,p,mx);
        p = V[p].p;
        fout << p << " ";
        update(1,1,n,p);
        if(p != 1)
            lazyupdate(1,1,n,1,p - 1, -1);

    }
    solve(1,1,n);
    return 0;
}