답안 #167628

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
167628 2019-12-09T06:49:17 Z Atill83 Tenis (COI19_tenis) C++14
7 / 100
73 ms 7056 KB
#include <bits/stdc++.h>
#define ff first
#define ss second
#define endl '\n'
using namespace std;
const long long INF = (long long) 1e18;
const int mod = (int) 1e9+7;
const int MAXN = (int) 1e5+5;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll n, q;
int a[MAXN], b[MAXN], c[MAXN];
ll yer1[MAXN], yer2[MAXN], yer3[MAXN], mx[MAXN];
pair<int, bool> t[4*MAXN];

void build(int v, int tl, int tr){
    if(tl == tr){
        t[v].ff = max(mx[a[tl]], max(mx[b[tl]], mx[c[tl]]));
        if(t[v].ff <= tl){
            t[v].ss = 1;
        }
    }else{
        int tm = (tl + tr) / 2;
        build(2*v, tl, tm);
        build(2*v + 1, tm + 1, tr);
        if(t[2*v].ss == 1){
            t[v].ff = t[2*v].ff;
            t[v].ss = 1;
        }else if(t[2*v + 1].ss == 1){
            t[v].ff = max(t[2*v].ff, t[2*v + 1].ff);
            if(t[v].ff <= tr)
                t[v].ss = 1;
        }else{
            t[v].ff = max(t[2*v].ff, t[2*v + 1].ff);
        }
    }
}

void upd(int v, int tl , int tr, int pos){
    if(tl == tr){
        t[v].ff = max(mx[a[tl]], max(mx[b[tl]], mx[c[tl]]));
        if(t[v].ff <= tl){
            t[v].ss = 1;
        }
    }else{
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            build(2*v, tl, tm);
        else
            build(2*v + 1, tm + 1, tr);
        if(t[2*v].ss == 1){
            t[v].ff = t[2*v].ff;
            t[v].ss = 1;
        }else if(t[2*v + 1].ss == 1){
            t[v].ff = max(t[2*v].ff, t[2*v + 1].ff);
            if(t[v].ff <= tr)
                t[v].ss = 1;
        }else{
            t[v].ff = max(t[2*v].ff, t[2*v + 1].ff);
        }
    }
}

int que(){
    return t[1].ff;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);

    #ifdef Local
        freopen("../IO/int.txt","r",stdin);
        freopen("../IO/out.txt","w",stdout);
    #endif

    cin>>n>>q;

    for(int i = 1; i <= n; i++){
        cin>>a[i];
        yer1[a[i]] = i;
    }
    for(int i = 1; i <= n; i++){
        cin>>b[i];
        yer2[b[i]] = i;
    }
    for(int i = 1; i <= n; i++){
        cin>>c[i];
        yer3[c[i]] = i;
        mx[c[i]] = max(yer3[c[i]], max(yer2[c[i]], yer1[c[i]]));
    }
    bool deg = 0;
    build(1, 1, n);
    int yer;
    while(q--){
        int type;
        cin>>type;
        if(type == 1){
            int x;
            cin>>x;
            if(deg == 0){
                deg = 1;
                yer = que();
            }
            //cout<<yer<<endl;
            cout<<(yer >= yer1[x] ? "DA" : "NE")<<endl;
        }else{
            deg = 0;
            int court, l, r;
            cin>>court>>l>>r;
            if(court == 1){
                swap(a[yer1[l]], a[yer1[r]]);
                swap(yer1[l], yer1[r]);
                ll cur1 = a[yer1[l]], cur2 = a[yer1[r]];
                mx[cur1] = max(yer3[cur1], max(yer2[cur1], yer1[cur1]));
                mx[cur2] = max(yer3[cur2], max(yer2[cur2], yer1[cur2]));
                upd(1, 1, n, yer1[l]);
                upd(1, 1, n, yer1[r]);
            }else if(court == 2){
                swap(b[yer2[l]], b[yer2[r]]);
                swap(yer2[l], yer2[r]);
                ll cur1 = b[yer2[l]], cur2 = b[yer2[r]];
                mx[cur1] = max(yer3[cur1], max(yer2[cur1], yer1[cur1]));
                mx[cur2] = max(yer3[cur2], max(yer2[cur2], yer1[cur2]));
                upd(1, 1, n, yer2[l]);
                upd(1, 1, n, yer2[r]);
            }else{
                swap(c[yer3[l]], c[yer3[r]]);
                swap(yer3[l], yer3[r]);
                ll cur1 = c[yer3[l]], cur2 = c[yer3[r]];
                mx[cur1] = max(yer3[cur1], max(yer2[cur1], yer1[cur1]));
                mx[cur2] = max(yer3[cur2], max(yer2[cur2], yer1[cur2]));
                upd(1, 1, n, yer3[l]);
                upd(1, 1, n, yer3[r]);
            }
        }

    }


    #ifdef Local
        cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
    #endif
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 380 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 380 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Incorrect 2 ms 376 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 380 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Incorrect 2 ms 376 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 73 ms 7056 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 380 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Incorrect 2 ms 376 KB Output isn't correct
8 Halted 0 ms 0 KB -