QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#468985#5022. 【模板】线段树MODDICompile Error//C++205.7kb2024-07-09 09:13:272024-07-09 09:13:27

Judging History

This is the latest submission verdict.

  • [2024-07-09 09:13:27]
  • Judged
  • [2024-07-09 09:13:27]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
#define pb push_back
#define mp make_pair
void sub1(int n, int q, vector<int> arr){
    vector<int> store(n);
    while(q--){
        int oper;
        cin>>oper;
        if(oper == 2){
            int pos;
            cin>>pos;
            pos--;
            cout<<arr[pos]<<"\n";
        }
        else{
            int l, r;
            cin>>l>>r;
            l--; r--;
            for(int i = l + 1; i <= r; i++){
                store[i] = (arr[i] ^ arr[i-1]);
            }
            for(int i = l + 1; i <= r; i++){
                arr[i] = store[i];
            }
        }
    }
    for(int i = 0; i < n; i++){
        cout<<arr[i]<<"\n";
    }
}
void sub23(int sub, int n, int q, vector<int> arr){
    const int N = 250000+3;
    bitset<N> now, tmp;
        if (sub == 2) now[1] = 1;
        else for (int i = 1; i <= n; ++i) now[i] = arr[i-1];
        int opt, l, r;
        while (q--) {
            cin>>opt;
            if (opt == 1) {
                cin>>l>>r;
                tmp.set();
                tmp >>= l;
                tmp <<= (N - r + l);
                tmp >>= (N - r);
                tmp &= now;
                tmp <<= 1;
                now ^= tmp;
            }else {
                cin>>l;
                if (sub == 2) {
                    if (now[l] == 1) cout<<arr[0]<<"\n";
                    else cout<<0<<"\n";
                }
                else cout<<(int)now[l]<<"\n";
            }
        }
        if (sub == 2) for (int i = 1; i <= n; ++i) cout<<(now[i] ? arr[0] : 0)<<"\n";
        else for (int i = 1; i <= n; ++i) cout<<(int)now[i]<<"\n";
}
void sub4(int n, int q, vector<int> arr){
    const int bsz = 505;
    struct block{
        array<int, bsz> b;
        deque<int> d;
        array<int, bsz> sms;
        int cnt;
        void build(){
            for(int i = 0; i < bsz; i++){
                sms[i] = b[bsz-i-1];
            }
            for(int j = 0; j < 8; j++){
                for(int i = 0; i < 8; i++){
                    if((i >> j) & 1){
                        sms[i] ^= sms[i - (1 << j)];
                    }
                }
            }
        }
        void rebuild(int l = 0, int r = 0){
            for(int j = 0; j < 8; j++){
                if((cnt >> j) & 1){
                    for(int i = bsz-1; i >= (1 << j); i--){
                        b[i] ^= b[i- (1 << j)];
                    }
                }
            }
            cnt = 0;
            for(int j = 0; j < 8; j++){
                for(int i = 0; i + (1 << j) < (int) d.size(); i++){
                    if(((i >> j) & 1) == 0){
                        d[i] ^= d[i + (1 << j)];
                    }
                }
            }
            for(int i = 0; i < bsz && i < (int) d.size(); i++){
                b[i] ^= d[i];
            }
            d.clear();
            for(int i = r; i > l; i--){
                b[i] ^= b[i-1];
            }
            build();
        }
        void xor_bg(ll x){
            if(d.empty()){
                d.pb(0);
            }
            d[0] ^= x;
            if(d.size() >= bsz){
                rebuild();
            }
        }
        void shift(){
            cnt++;
            d.push_front(0);
        }
        void build(const vector<int> &a){
            cnt = 0;
            d.clear();
            for(int i = 0; i < (int) a.size(); i++){
                b[i] = a[i];
            }
            build();
        }
        int get_lst(){
            return sms[cnt & (bsz - 1)];
        }
    };
    struct ask{
        int t, l, r;
    };
    vector<block> s;
    vector<ask> queries;
    vector<ll> rs;
    rs.reserve(q + n);
    s.resize((n + bsz - 1) / bsz);
    for(int l = 0; l < n; l += bsz){
        int r = min(n, l + bsz);
        s[l / bsz].build(vector<int>(arr.begin() + l, arr.begin() + r));
    }
    queries.resize(q);
    for(int i = 0; i < q; i++){
        int t;
        cin>>t;
        if(t == 1){
            int l, r;
            cin>>l>>r;
            --l;
            --r;
            queries[i] = {t, l, r};
        }
        else{
            int pos;
            cin>>pos;
            --pos;
            queries[i] = {t, pos, 0};
        }
    }
    auto b = arr;
    for(auto [t, l, r] : queries){
        if(t == 1){
            while(l / bsz < r / bsz){
                int t = r / bsz;
                if(r == t * bsz + bsz - 1){
                    s[t].shift();
                }
                else{
                    s[t].rebuild(0, r- t * bsz);
                }
                s[t].xor_bg(s[t-1].get_lst());
                r = t * bsz - 1;
            }
            int t = l / bsz;
            s[t].rebuild(l - t * bsz, r - t * bsz);
        }
        else{
            int pos = l;
            int t = pos/bsz;
            s[t].rebuild();
            int ans = s[t].b[pos - t*bsz];
            rs.pb(ans);
        }
    }
    for(int i = 0; i < n; i++){
        int t = i / bsz;
        if(t * bsz == i){
            s[t].rebuild();
        }
        int ans = s[t].b[i - t * bsz];
        rs.pb(ans);
    }
    for(auto t : rs){
        cout<<t<<"\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int sub;
    cin>>sub;
    int n, q;
    cin>>n>>q;
    vector<int> arr(n);
    for(int i = 0; i < n; i++)  cin>>arr[i];
    if(sub == 1)  sub1(n, q, arr);
    else if(sub == 2 || sub == 3) sub23(sub, n, q, arr);
    else sub4(n, q, arr);
    else assert(false);
}

详细

answer.code: In function ‘int main()’:
answer.code:215:5: error: ‘else’ without a previous ‘if’
  215 |     else assert(false);
      |     ^~~~