Submission #1161445

#TimeUsernameProblemLanguageResultExecution timeMemory
1161445son2008Joker (BOI20_joker)C++20
0 / 100
292 ms18716 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "odd"
#define ii pair<int,int>
#define fi first
#define se second
#define int long long
#define ll long long
#define ld double
#define mp make_pair
#define lg2 30
#define iii pair<ll,ii>
#define iiii pair<ii,ii>
#define base 29
#define eps 1e-8
int dx[]= {0LL,0LL,1,-1,1,1,-1,-1};
int dy[]= {1,-1,0LL,0LL,1,-1,1,-1};
const int maxn=2e5+5,maxm=1e4+5,maxq=1e5+5;
const int mod=1e9+7;
ii edge[maxn],par[maxn];
int f[maxn];
int rk[maxn],n,m,q;
struct node
{
    int a,x,b,y;
    bool c;
};
stack<node>st;
bool bipartiteness=true,nho[maxn];
ii acs(int u)
{
    if(u!=par[u].fi)
    {
        int parity=par[u].se;
        par[u]=acs(par[u].fi);
        par[u].se^=parity;
    }
    return par[u];
}
bool join(int u,int v)
{
    ii pa=acs(u),pb=acs(v);
    int a=pa.fi,x=pa.se;
    int b=pb.fi,y=pb.se;
    if(a==b)
    {
        if(x==y)
        {
            st.push({a,rk[a],b,rk[b],bipartiteness});
            bipartiteness=false;
            return true;
        }
        return false;
    }
    if(rk[a]<rk[b])swap(a,b);
    st.push({a,rk[a],b,rk[b],bipartiteness});
    par[b]={a,x^y^1};
    if(rk[a]==rk[b])rk[a]++;
    return true;
}
void rollback()
{
    node t=st.top();
    st.pop();
    int a=t.a,b=t.b,x=t.x,y=t.y,c=t.c;
    par[a]={a,0};
    par[b]={b,0};
    rk[a]=x;
    rk[b]=y;
    bipartiteness=c;
}
void init()
{
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
    {
        par[i]={i,0};
    }
    for(int i=1;i<=m;i++)
    {
        cin>>edge[i].fi>>edge[i].se;
    }
}
void dnc(int l1,int l2,int r1,int r2)
{
    if(l1>l2)return;
    int mid=(l1+l2)/2;
   // cout<<l1<<" "<<l2<<" "<<r1<<" "<<r2<<'\n';
    for(int i=l1;i<mid;i++)
    {
        nho[i]=join(edge[i].fi,edge[i].se);
    }
    f[mid]=max(r1,mid)-1;
    if(mid==1)
    {
      //  cout<<f[mid]<<'\n';
    }
    for(int i=r2;i>=max(r1,mid);i--)
    {
        if(!bipartiteness)
        {
            f[mid]=i;
            break;
        }
        nho[i]=join(edge[i].fi,edge[i].se);
    }
    if(mid==1)
    {
        //cout<<f[mid]<<'\n';
    }
    for(int i=f[mid]+1;i<=r2;i++)
    {
        if(nho[i])rollback();
    }
    for(int i=mid-1;i>=l1;i--)
    {
        if(nho[i])rollback();
    }
  /*  if(mid==2){
    cout<<bipartiteness<<'\n';
    for(int i=1;i<=n;i++)cout<<par[i].fi<<" "<<par[i].se<<'\n';
    }*/
    for(int i=f[mid]+1;i<=r2;i++)nho[i]=join(edge[i].fi,edge[i].se);
   /* if(mid==2){
    cout<<bipartiteness<<'\n';
    }*/
    dnc(l1,mid-1,r1,f[mid]);
    for(int i=r2;i>=f[mid]+1;i--)if(nho[i])rollback();
    for(int i=l1;i<=mid;i++)nho[i]=join(edge[i].fi,edge[i].se);
    dnc(mid+1,l2,f[mid],r2);
    for(int i=mid;i>=l1;i--)if(nho[i])rollback();
}
void process()
{
    dnc(1,m,1,m);
    /*for(int i=1;i<=m;i++)
    {
        cout<<f[i]<<" ";
    }
    cout<<'\n';*/
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        if(f[l]>=r)
        {
            cout<<"YES"<<'\n';
        }
        else
            cout<<"NO"<<'\n';
    }
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if(fopen(task".inp","r"))
    {
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    init();
    process();
    cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ;
}

Compilation message (stderr)

Joker.cpp: In function 'int main()':
Joker.cpp:160:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:161:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...