QOJ.ac

QOJ

Limite de temps : 5 s Limite de mémoire : 60 MB - 2048 MB Points totaux : 100 Difficulté: [afficher]

#18227. Wspomnienia desuwa

Statistiques

Uwaga: poza pierwszym podzadaniem, limit pamięci w tym zadaniu wynosi 60 MB.

Tło zadania

Zhengxu Sakiko jest znanym zawodnikiem w programowaniu sportowym. Jednak ze względu na słabą pamięć często zapomina poznane algorytmy.

Dlatego tak często wspomina przeszłość.

Treść zadania

Proszę zwrócić uwagę na specjalne ograniczenia pamięciowe w tym zadaniu.

Dany jest zbiór $m$ trójek $(l, r, v)$.

Należy wykonać $q$ operacji. Każda operacja składa się z podania $x$ oraz $y$ i polega na znalezieniu maksymalnej wartości $v$ wśród wszystkich trójek spełniających warunki $l \le x \le r$ oraz $v \le y$.

Jeśli nie istnieje żadna trójka spełniająca te warunki, należy wypisać $0$.

Zadanie wymaga obsługi zapytań w trybie online.

Wejście

W pierwszej linii znajdują się dwie liczby całkowite $m$ oraz $q$.

W kolejnych $m$ liniach znajdują się po trzy liczby całkowite opisujące trójkę $(l, r, v)$.

W kolejnych $q$ liniach znajdują się po dwie liczby całkowite $p$ oraz $q$, oznaczające, że bieżące zapytanie spełnia warunki $x = p \oplus ans$ oraz $y = q \oplus ans$, gdzie $\oplus$ oznacza operację XOR, a $ans$ to wynik poprzedniego zapytania po wykonaniu operacji bitowej AND z wartością $2^{21}-1$. Początkowa wartość $ans$ wynosi $0$.

Wyjście

Dla każdego zapytania należy wypisać wynik w osobnej linii.

Przykład 1

Wejście 1

5 5
3 5 3
4 5 10
3 4 2
1 4 13
1 1 6
1 6
7 11
9 14
2 1
5 14

Wyjście 1

6
13
3
0
10

Przykład 2

Wejście 2

15 15
3 9 9
3 5 10
8 15 10
4 6 4
8 13 6
3 7 0
11 11 11
8 10 11
3 3 14
3 15 13
4 15 9
6 11 7
4 5 12
6 12 10
10 10 14
9 5
1 5
8 11
14 9
8 14
3 11
7 1
4 3
3 1
12 15
9 4
13 15
0 3
13 12
6 13

Wyjście 2

0
0
11
0
13
0
0
0
0
13
9
4
4
7
0

Podzadania

Nazwa podzadania Numer podzadania Punkty Ograniczenia
Utrzymanie "na piechotę" 1 25 Limit pamięci 2048 MiB
Łatwy zysk 2 25 $q \le 3 \times 10^4$
Mistrz struktur danych 3 25 $q \le 10^5$
Jestem tylko złudzeniem 4 25 Brak specjalnych ograniczeń

Dla wszystkich danych wejściowych: $1 \le m, q \le 10^6$, $1 \le l \le r \le 2 \times 10^6$, $0 \le v < 2^{31}$, $1 \le x \le 2 \times 10^6$, $0 \le y < 2^{31}$.

Uwagi

Dodatkowo, poniżej znajduje się kod napisany przez małego Z, rozwiązujący problem $k$-tej najmniejszej wartości w przedziale, który może okazać się pomocny.

#include <bits/stdc++.h>
using namespace std;
constexpr int Spp{1<<20},S2{1<<20};
char buf[Spp],*p1,*p2,buf2[S2],*l2=buf2,_st[22];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,Spp,stdin),p1==p2)?EOF:*p1++)
#define putchar(c) (l2==buf2+S2&&(fwrite(buf2,1,S2,stdout),l2=buf2),*l2++=(c))
template <typename T>
void read(T &x) {
    char c;int f{1};
    do x=(c=getchar())^48;
    while (!isdigit(c)&&c!='-');
    if (x==29) f=-1,x=0;
    while (isdigit(c=getchar()))
        x=(x*10)+(c^48);
    x*=f;
}
template <typename T,typename ...Args>
void read(T& x,Args&... args) {read(x);read(args...);}
template<typename T>
void write(T x,char c='\n') {
    if (x<0) putchar('-'),x*=-1;
    int tp=0;
    do _st[++tp]=x%10; while (x/=10);
    while (tp) putchar(_st[tp--]+'0');
    putchar(c);
}
struct OI{~OI(){fwrite(buf2,1,l2-buf2,stdout);}}oi;
using LL=unsigned long long;
// wavelet
struct bits {
    vector<LL> bl;
    vector<int> c;
    void resize(int num) {
        bl.resize(((num+1)>>6)+1);
        c.resize(bl.size());
    }
    void set(int i,LL val) {bl[i>>6]|=(val<<(i&63));}
    void build() {
        for (int i=1;i<bl.size();++i)
            c[i]=c[i-1]+popcount(bl[i-1]);
    }
    int rk1(int i) {return c[i>>6]+popcount(bl[i>>6]&((1uLL<<(i&63))-1));}
    int rk0(int i) {return i-rk1(i);}
};
struct wavelet {
    int h;
    vector<bits> B;
    vector<int> pos;
    void init(vector<int>& v) {
        h=__lg(*max_element(v.begin(),v.end()))+1;
        B.resize(h);pos.resize(h);
        for (int i=0;i<h;++i) {
            B[i].resize(v.size());
            for (int j=0;j<v.size();++j)
                B[i].set(j,(v[j]>>(h-i-1)&1));
            B[i].build();
            pos[i]=stable_partition(v.begin(),v.end(),[&](int c){
                return !(c>>(h-i-1)&1);
            })-v.begin();
        }
    }
    int qry(int i,int j,int k,int l,int r,int x) {
        if (i==j) return 0;
        if (r==l+1) return l;
        int mid=l+r>>1;
        int L{B[x].rk0(i)},R{B[x].rk0(j)};
        if (R-L>=k) return qry(L,R,k,l,mid,x+1);
        else return qry(pos[x]+B[x].rk1(i),pos[x]+B[x].rk1(j),k-(R-L),mid,r,x+1);
    }
} tr;
int main() {
    int n,m;read(n,m);
    vector<int> a(n);
    for (int i=0;i<n;++i) read(a[i]);
    tr.init(a);
    while (m--) {
        int l,r,k;read(l,r,k);
        write(tr.qry(l-1,r,k,0,1<<tr.h,0));
    }
    return 0;
}

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.